C 語言入門/C 預處理器指令
外觀
< C 語言入門
我們已經看到了“#include”和“#define”預處理器指令。C 預處理器還支援其他一些指令。所有這些指令都以“#”開頭,以便與 C 語言命令區分開來。
正如第一章所述,“#include”指令允許將其他檔案的內容包含在 C 原始碼中
#include <stdio.h>
注意,標準標頭檔案“stdio.h”用尖括號指定。這告訴 C 預處理器,該檔案可以在 C 編譯器為標頭檔案指定的標準目錄中找到。要包含來自非標準目錄的檔案,請使用雙引號
#include "\home\mydefs.h"
包含檔案可以巢狀。它們可以呼叫其他包含檔案。
同樣在第一章中已經解釋過,“#define”指令可以用來指定符號以替換特定的文字字串
#define PI 3.141592654
...
a = PI * b;
在這種情況下,預處理器在整個原始碼清單中對 PI 進行簡單的文字替換。C 編譯器本身不僅不知道 PI 是什麼,而且它甚至從未見過它。
“#define”指令可以用來建立類似函式的宏,這些宏允許引數替換。例如
#define ABS(value) ( (value) >=0 ? (value) : -(value) )
然後,這個宏可以在表示式中使用,如下所示
printf( "Absolute value of x = %d\n", ABS(x) );
注意,這種類似函式的宏的行為與真正的函式不完全相同。例如,假設“x++”是上面宏的引數
val = ABS(x++);
這會導致“x”被增加兩次,因為“x++”在表示式中被替換了兩次
val = ( (x++) >=0 ? (x++) : -(x++) )
除了“#define”指令外,還有一個“#undef”指令,它取消定義之前定義的常量
#undef PI
C 預處理器支援的另一個功能是條件編譯,使用以下指令
#if
#else
#elif
#endif
這些指令可以測試定義的常量的值,以定義哪些程式碼塊傳遞給 C 編譯器本身
#if WIN == 1
#include "WIN.H"
#elif MAC == 1
#include "MAC.H"
#else
#include "LINUX.H"
#endif
如果需要,這些指令可以巢狀。"#if" 和 "#elif" 還可以測試常量是否已定義,使用“defined”運算子
#if defined( DEBUG )
printf( "Debug mode!\n");
#endif
—或者測試常量是否未定義
#if !defined( DEBUG )
printf( "Not debug mode!\n");
#endif
最後,還有一個“#pragma”指令,根據定義,它是用來實現非標準 C 語言的機器特定命令的萬能指令。由於 pragmas 是非標準的,因此它們因編譯器而異。