一.前言
1.編譯一個C程序涉及很多步驟。其中第一步驟稱為預處理(preprocessing)階段。C預處理器(preprocessor)在源代碼編譯之前對其進行文本性質的操作。
2.它的主要任務包括刪除注釋、插入被#include指令包含的內容、定義和替換由#define指令定義的符號以及確定代碼的部分內容是否應該根據一些條件編譯指令經行編譯。
二.預定義符號
1.以下為預處理器定義的符號。它們的值或者是字符串常量,或者是十進制數字常量。
2.__FILE__和__LINE__在確認調試輸出時很有用。__DATE__和__TIME__常常用於在被編譯的程序中加入版本信息。
3.__STDC__用於那些在ANSI環境和非ANSI環境都必須進行編譯的程序中結合條件編譯。
注:
此處的前綴是兩個下劃線.
² __FILE__:用%s進行輸出,輸出結果為源程序名。
² __LINE__:用%d進行輸出,輸出結果為文件當前行號。
² __DATE__:用%s進行輸出,輸出結果為文件被編譯的日期
² __STDC__:用%d進行輸出,如果編譯器遵循ANSIC,其數值為1。否則未定義。
三.#define
1.#define的用法:
#define name stuff
有了這條指令以後,每當有符號name出現在這條指令後面時,預處理器就會把它替換成stuff。
2.替換文本並不僅限於數值字面值常量。使用#define指令,可以把文本替換到程序中。
3.如果定義中的stuff非常長,可以將其分成幾行,除了最後一行之外,每行的末尾都要加一個反斜槓。
Eg:
#define DEBUG_PRINT printf(“File %s line%d:” \
”x=%d,y=%d,z=%d”,\
__FILE__,__LINE__,\
x,y,z)
說明:此處利用了相鄰的字符串常量被自動連接為一個字符串的這個特性。
4.在宏定義的末尾不要加上分號。如果加了則會出現一條空語句。
Eg:
DEBUG_PRINT;
此時,編譯器替換後會都一條空語句.
1>有時候只允許出現一條語句,如果放入兩條語句就會出現問題
Eg:
if(…)
DEBUG_PRINT;
else
…..