可以出現在**任何地方從本行開始之後的**都可以使用該巨集常量
巨集表示式#define min(a,b) ((a避免巨集表示式**現++巨集表示式預編譯時被處理,編譯器棒子點巨集表示式的存在#define dim(array) (sizeof(array) / sizeof(*array))
int dim(int array)
//因為傳進來的被看成了乙個指標導致始終為1
int main()
; printf("%d\n",dim(a)); //1
printf("%d\n", dim(a)); //5
}
巨集表示式用「實參」完全代替形參,不進行任何計算
無任何呼叫開銷
不能出現遞迴
使用範圍如果沒有#undef會一直存在
巨集**塊#define malloc(type,x) (type*)malloc(sizeof(type)*x)#define forever() while(1)
#define begin
#define foreach(i,m) for(i=0,i內建巨集
void log(char* s)
//無法正確列印行號,都是該函式的行
#define log(s) printf("%s:%d\n", __file__, __line__, s) //可以正確列印
預編譯指示命令,用於控制是否編譯某段**#define c 1可以避免重複包含同乙個標頭檔案int main()
可以區分不同產品線**
可以定義產品發布版除錯版
生成編譯錯誤資訊+停止編譯#error message 無需闊號
生成編譯警告,但不會停止編譯
#define const_name1 "const_name1"#define const_name2 "const_name2"
int main()
用於強制指定新的行號和新的編譯檔名,本質是重定義line,file
編譯器指示字,用於指示編譯器完成一些特定動作不同編譯器可能用不同方式解釋同一條#pragma
#pragma message 在編譯時輸出訊息到編譯輸出視窗
#include #if defined(android20)
#pragma message("compile android sdk 2.0...")
#define version "android 2.0"
#elif defined(android23)
#pragma message("compile android sdk 2.3...")
#define version "android 2.3"
#elif defined(android40)
#pragma message("compile android sdk 4.0...")
#define version "android 4.0"
#else
#error compile version is not provided!
#endif
int main()
#pragma pack如果資料未對齊,需要兩次匯流排訪問週期來訪問記憶體,效能降低
記憶體讀取不是連續而是分塊讀取
struct占用記憶體大小:
第乙個成員起始於0偏移處
偏移位址和 成員占用均需對齊
結構體總長度為其所有對其引數的整數倍
結構體預設對齊方式為其對齊引數中最大的乙個
#pragma pack(8)struct s1
;struct s2
;#pragma pack()
int main()
用於在預編譯期將巨集引數轉化為字串#include #define call(f, p) (printf("call function %s\n", #f), f(p))//逗號運算子確保運算元被順序地處理:先計算左邊的運算元,再計算右邊的運算元。右運算元的型別和值作為整個表示式的結果。
int square(int n)
int f(int x)
int main()
用於在預編譯期粘連兩個符號#include #define struct(type) typedef struct _tag_##type type;\struct _tag_##type
struct(student)
;int main()
C語言深度解剖 預處理
1 line 表示正在編譯的檔案的行號,2 file 表示正在編譯的檔案的名字,3 date 表示編譯時刻的日期字串,4 time 表示編譯時刻的時間字串,5 stdc 判斷該檔案是不是定義成標準c程式。一 巨集定義 1 數值巨集常量 define pi 3.141592654 define err...
C 編譯預處理
c 的預處理是編譯器在編譯源程式之前,先由預處理器處理預處理指令,由於在c 源程式中有各種編譯命令,而這些編譯命令由於是在程式被正常編譯之前執行的,故稱為預處理命令 或指令 預編譯命令用來擴充c 程式設計的環境,使得程式書寫變得更加簡練和清晰。c 提供的預處理功能主要有以下3種 巨集定義命令。檔案包...
C語言深度解剖讀書筆記 3 預編譯處理
1.編譯過程的簡介 預編譯 a.處理所有的注釋,以空格代替。b.將所以 define刪除,並展開所有的巨集定義,字串替換。c.處理條件編譯指令 if,ifdef,elif,else,endif d.處理 include,並展開被包含的檔案,把頭檔案中的宣告,全部拷貝到檔案中。e.保留編譯器需要使用的...