預處理器在源**編譯前對其進行一些文字性質的操作, 主要任務包括刪除注釋, 插入被#include
指令包含的檔案的內容, 定義和替換由#define
指令定義的符號以及確定**的部分內容是否應該根據一些條件編譯指令進行編譯.
#define
max(a, b) ((a) > (b) ? (a) : (b))
max(2, 4); // 等價與((2) > (4) ? (2) : (b))
使用#define
指令有以下幾點需要注意:
(1) 不要在定義或巨集的最後加;來表示語句的結束.
(2) 在巨集定義時為每乙個巨集引數以及stuff的最外圍加上括號.
(3)#define
內部可以巢狀#define
, 但是不能遞迴巢狀.
(4) 當巨集引數在巨集定義中出現次數超過一次時要格外注意每次出現是巨集引數的值有沒有發生潛在的變化.
(4)#define
的名字統一要大寫.
#define pi 3.1415 // 定義pi
#undef pi // 使pi定義失效
#include
// 到系統目錄搜尋headfile.h
#include
"headfile.h"
// 先到當前工作目錄搜尋headfile.h, 未找到的話再去系統目錄
#include
"/use/test/headfile.h"
// 直接去指定的目錄搜尋headfile.h
// 組合1
#ifdef name // 等價與 #if define(name)
...#else
...#endif
// 組合2
#ifdef name
...#elif
...#else
...#endif
// 組合3
#ifndef name // 等價與 #if !define(name)
...#else
...#endif
// 組合4
#ifndef name
...#endif
#define pi 3.1415
#ifndef pi
#error not define pi
#endif
當未定義pi時, 預處理器會發出not define pi資訊, 並停止預處理.
#line 50 // 重置當前行號為50
#line 100 "test.c" // 重置當前檔名為test.c
// 字串中引數名a被視為字元
#define
printsquare(a)
printf("the square of a is: %d\n", ((a) * (a)))
printsquare(3); // 輸出:the square of a is: 9
// 字串中引數名a被視為巨集引數
#define
printsquare(a)
printf("the square of "#a" is: %d\n", ((a) * (a)))
printsquare(3); // 輸出:the square of 3 is: 9
#define xname(n) x##n
int xname(1) = 0; // 等價於: int x1 = 0;
int xname(2) = 1; // 等價於: int x2 = 1;
#define max(a, b) ((a) > (b) ? \
(a) : (b))
C語言 預處理器
如果想在下一行延續指令,則在當前行末尾使用 字元 帶引數的巨集 define max x,y x y x y define is even n n 2 0 則i max j k,m n if is even i i 將被替換為 i j k m n j k m n if i 2 0 i 巨集的替換列表...
C語言 預處理器
指令 描述 define 定義巨集 macro include 包含乙個源 檔案 undef 取消已定義的巨集 ifdef 如果巨集已經定義,則返回真 ifndef 如果巨集沒有定義,則返回真 if如果給定條件為真,則編譯下面 else if 的替代方案 endif 結束乙個if.else條件編譯塊...
C語言 預處理器
6 gcc編譯器檢視替換後的編碼 7 標頭檔案相互包含導致的重定義錯誤 指令 描述 define 定義巨集 include 包含乙個源 檔案 undef 取消已定義的巨集 ifdef 如果巨集已經定義,則返回真 ifndef 如果巨集沒有定義,則返回真 if如果給定條件為真,則編譯下面 else i...