預處理器(未完待續...)

1.預定義符號(共支持5個符號)

_FILE_進行編譯的文件名 
_LINE_     文件當前行的行號
上兩個在確認調試輸入的來源方面有用處

_DATA_ 文件被編譯的日期
_TIME_    文件被編譯的時間
上兩個用於在被編譯的程序中加入版本信息

_STDC_ 如果編譯器遵循ANSI C,其值就爲1,否則未定義。

2.宏定義#define

帶參數宏注意:
1.所有用於對數值表達式進行求值的宏定義都應該儘量加上括號,避免出錯。
如 #define  double( x )( ( 5 ) + ( 5 ) )
2.判定if條件只對它後面的一個語句有效,if語句後帶有宏參數時注意加上do{ ;} while(0)
如 #define   func( a , b )do{ a+b ; a++; } while( 0 )
if ( a > b )
func(a ,b )
else
;
宏代替函數,可以解決函數無法解決的任務,如將類型作爲參數進行傳遞
#define MALLOC( n , type ) \
( ( type * ) malloc ( ( n ) * sizeof ( type ) ) )
type 作爲類型在函數中是無法作爲參數傳遞的。
宏參數副作用:
宏參數在宏定義中出現次數超過一次,可能會出現不可預料的結果。
如x++
#define MAX( a, b )( ( a) > ( b) ) ? ( a ) :( b ) )
...
x = 5 ; 
y = 8 ;
z = MAX ( x++ , y++ );
替換結果 :( ( x++ ) > ( y++ ) ) ? ( x++ ) :( y++ ) )
輸出結果 :6,10,9

#undef : 移除一個宏定義。如果一個現存的名字需被重新定義,其舊定義必須先被移除
提供符號命令行定義的編譯器通常也提供在命令行中去除符號的定義。如在UNIX編譯器中,-U選項執行該任務。

3.條件編譯

目的:維護性修改源代碼時,如果不想將某些語句物理刪除,可以選擇條件編譯。
    
  #define  DEBUG    1
  #if      DEBUG		//如果爲真,就編譯
  	STATEMENTS
  #elif	   DEBUG
	OTHER STATEMENTS
  #else    
	OTHER STATEMENTS
  #endif
    

4.文件包含#include

包括函數庫文件包含#include<filename.h>和本地文件包含#define "filename.h"
嵌套文件包含:在一個將被其他文件包含的文件中使用#include指令。

5.其他指令

   #error允許生成錯誤信息
        #line    number     "string"        通知預處理器number是一個下一行輸入的行號。“string”被預處理器當做當前文件的名字。
#progma允許編譯選項或其他任何方式無法實現的一些處理方式。
無效指令以#開頭,後面不跟任何內容的一行。這類指令只是被預處理器簡單地刪除。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章