第十四章
- 指令的規(guī)則
- 指令都以
#開始 - 在指令的符號(hào)之間可以插入任意數(shù)量的空格或水平制表符
- 指令總是在第一個(gè)換行符處結(jié)束,除非明確的指明要延續(xù)
- 指令可以出現(xiàn)在程序中的任意地方
- 注釋可以和指令放在同一行
- 指令都以
- 使用帶參數(shù)宏替代函數(shù)的優(yōu)缺點(diǎn)
- 程序可能會(huì)稍微快些,程序調(diào)用函數(shù)會(huì)有些額外的開銷——存儲(chǔ)上下文信息,復(fù)制參數(shù)值等(C99的內(nèi)聯(lián)函數(shù)提供了另一種避免這種開銷辦法)
- 宏更“通用”:可以接受任意類型的參數(shù)
- 編譯后的代碼通常會(huì)變大
- 宏參數(shù)沒有類型檢查
- 無法使用一個(gè)指針指向一個(gè)宏
- 宏可能不止一次的計(jì)算參數(shù)
-
#運(yùn)算符:將宏的一個(gè)參數(shù)轉(zhuǎn)換為字符串字面量#define PRINT_INT(X) printf(#x " =%d\n",x)
-
##運(yùn)算符:將兩個(gè)記號(hào)(如標(biāo)識(shí)符)“粘合”在一起,成為一個(gè)記號(hào)。- 用的地方不是很多,可用于生成標(biāo)識(shí)符,或者函數(shù)
- 宏的通用屬性
- 宏的替換列表可以包含對(duì)其它宏的調(diào)用
- 預(yù)處理器只會(huì)替換完整地記號(hào),不會(huì)替換記號(hào)的片段
- 宏定義的作用范圍通常到出現(xiàn)這個(gè)宏的文件末尾
- 宏不可以被定義兩遍,除非新的定義與舊的定義是一樣的
- 宏可以使用
#undef指令“取消定義”
- 空的宏參數(shù)
- C99允許宏調(diào)用中的任意或所有參數(shù)為空。當(dāng)然這樣的調(diào)用需要和一般調(diào)用有一樣多的逗號(hào)。
- 當(dāng)空參數(shù)是
#運(yùn)算符的操作數(shù),空的實(shí)際參數(shù)被#運(yùn)算符“字符串化”,則結(jié)果為""(空字符串) - 當(dāng)空參數(shù)是
##運(yùn)算符的操作數(shù),空的實(shí)際參數(shù)會(huì)被不可見的“位置標(biāo)記”記號(hào)代替。把原始的記號(hào)與位置標(biāo)記記號(hào)相連接,得到的還是原來的記號(hào)(位置標(biāo)記記號(hào)消失了),如果連接兩個(gè)位置標(biāo)記記號(hào),得到的是一個(gè)位置標(biāo)記記號(hào)。宏擴(kuò)展完成后,位置記號(hào)標(biāo)記從程序中消失。
- 參數(shù)個(gè)數(shù)可變的宏
- C89中,如果宏有參數(shù),那么個(gè)數(shù)是固定的。C99中可變,例:
#define TEST(...) printf(__VA_ARGS__)
- C89中,如果宏有參數(shù),那么個(gè)數(shù)是固定的。C99中可變,例:
-
__func__標(biāo)識(shí)符-
跟蹤函數(shù)調(diào)用
#define FUNCTION_CALLED() printf("%s called\n", __func__) #define FUNCTION_RETURNS() printf("%s returns\n", __func__)void f(){ FUNCTION_CALLED() ; ... FUNCTION_RETURNS(); } 作為參數(shù)傳遞給函數(shù),讓函數(shù)知道調(diào)用他的函數(shù)的名字
-
-
#line指令用法:#line n,#line n "文件"