|
|
宏的定義形式為: #define 宏名 宏體
要注意以下幾點(diǎn):
1、書寫時(shí),#define與宏名之間、宏名與宏體之間均以(一個(gè)或多個(gè))空格隔開,也即從宏名后的第一個(gè)非空格字符開始,直到本行結(jié)束之間的符號(hào)均作為宏體看待,看下面的例子:
若宏替換命令行后面加了分號(hào),則該分號(hào)將成為宏體的一部分。
如:#define N 8;
則宏體應(yīng)該是8;(分號(hào)也包括在內(nèi)!)
這時(shí),如果遇到語(yǔ)句
for(i=0;i<N-1;i++){...}
則宏替換后的形式為:
for(i=0;i<8;-1;i++){...}
該程序在編譯時(shí)將無(wú)法通過(guò),問(wèn)題也很難查出來(lái)。
切記:定義宏的時(shí)候,宏體后面千萬(wàn)不要加分號(hào),除非你本來(lái)就需要在宏體中加入這個(gè)分號(hào)!
2、宏替換過(guò)程
在進(jìn)行宏替換時(shí),要注意將宏名按定義時(shí)宏體的形式原封不動(dòng)地代入表達(dá)式中,不要增加任何其他的符號(hào)(尤其是小括號(hào)!),看下面的例子:
有如下程序
#define N 2
#define M N+1
#define NUM 2*M+1
main()
{
int i;
for(i=1;i<=NUM;i++) printf("%d\n",i);
}
則該程序中for循環(huán)執(zhí)行的次數(shù)是
A)5 B)6 C)7 D)8
為獲得宏名NUM的替換結(jié)果,先將宏名M的宏體N+1替換進(jìn)去,得到NUM的形式為:2*N+1+1,注意不能給M的宏體N+1隨意加小括號(hào),寫成2*(N+1)+1,這是最容易犯的錯(cuò)誤!!然后將N的宏體替換進(jìn)去,最后得到NUM的形式為2*2+1+1,該表達(dá)式的值為6,因此上述題目的正確答案為(B)。這是2000年9月二級(jí)C中的一道選擇題。
切記:在進(jìn)行宏替換時(shí),不要隨意給宏體加上小括號(hào),除非宏定義中本身就有小括號(hào)!
3、宏體不被替換的情況
(1) 雙引號(hào)中的與宏名相同的字符串將不被替換;
(2) 用戶標(biāo)識(shí)符中只有一部分與宏名相同的字符串將不被替換。
如有宏定義 #define PI 3.1415926
則:語(yǔ)句 printf("PI is 3.14");和 int myPI;中的"PI"均不被作為宏名而替換。
|
|