c深度解剖 編譯預處理

2021-10-02 01:46:02 字數 2759 閱讀 2368

可以出現在**任何地方

從本行開始之後的**都可以使用該巨集常量

巨集表示式

#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()

用於強制指定新的行號和新的編譯檔名,

本質是重定義linefile

編譯器指示字,用於指示編譯器完成一些特定動作

不同編譯器可能用不同方式解釋同一條#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.保留編譯器需要使用的...