宏表示的值可以是一個(gè)常量表達(dá)式,其中允許包括前面已經(jīng)定義的宏標(biāo)識(shí)符。例如:
#define ONE 1
#define TWO 2
#define THREE (ONE+TWO)
注意上面的宏定義使用了括號(hào)。盡管它們并不是必須的。但出于謹(jǐn)慎考慮,還是應(yīng)該加上括號(hào)的。例如:
six=THREE*TWO;
預(yù)處理過(guò)程把上面的一行代碼轉(zhuǎn)換成:
six=(ONE+TWO)*TWO;
如果沒(méi)有那個(gè)括號(hào),就轉(zhuǎn)換成six=ONE+TWO*TWO;了。
宏還可以代表一個(gè)字符串常量,例如:
#define VERSION Version 1.0 Copyright(c) 2003
2.帶參數(shù)的#define指令
帶參數(shù)的宏和函數(shù)調(diào)用看起來(lái)有些相似?匆粋(gè)例子:
#define Cube(x) (x)*(x)*(x)
可以時(shí)任何數(shù)字表達(dá)式甚至函數(shù)調(diào)用來(lái)代替參數(shù)x。這里再次提醒大家注意括號(hào)的使用。宏展開(kāi)后完全包含在一對(duì)括號(hào)中,而且參數(shù)也包含在括號(hào)中,這樣就保證了宏和參數(shù)的完整性?匆粋(gè)用法:
int num=8+2;
volume=Cube(num);
展開(kāi)后為(8+2)*(8+2)*(8+2);
如果沒(méi)有那些括號(hào)就變?yōu)?+2*8+2*8+2了。
下面的用法是不安全的:
volume=Cube(num++);
如果Cube是一個(gè)函數(shù),上面的寫(xiě)法是可以理解的。但是,因?yàn)镃ube是一個(gè)宏,所以會(huì)產(chǎn)生副作用。這里的擦?xí)皇呛?jiǎn)單的表達(dá)式,它們將產(chǎn)生意想不到的結(jié)果。它們展開(kāi)后是這樣的:
volume=(num++)*(num++)*(num++);
很顯然,結(jié)果是10*11*12,而不是10*10*10;
那么怎樣安全的使用Cube宏呢?必須把可能產(chǎn)生副作用的操作移到宏調(diào)用的外面進(jìn)行:
int num=8+2;
volume=Cube(num);
num++;
3.#運(yùn)算符
出現(xiàn)在宏定義中的#運(yùn)算符把跟在其后的參數(shù)轉(zhuǎn)換成一個(gè)字符串。有時(shí)把這種用法的#稱為字符串化運(yùn)算符。例如:
#define PASTE(n) adhfkj#n
main()
{
printf(%s\n,PASTE(15));
}
宏定義中的#運(yùn)算符告訴預(yù)處理程序,把源代碼中任何傳遞給該宏的參數(shù)轉(zhuǎn)換成一個(gè)字符串。所以輸出應(yīng)該是adhfkj15。
4.##運(yùn)算符
##運(yùn)算符用于把參數(shù)連接到一起。預(yù)處理程序把出現(xiàn)在##兩側(cè)的參數(shù)合并成一個(gè)符號(hào)?聪旅娴睦樱
#define NUM(a,b,c) a##b##c
#define STR(a,b,c) a##b##c
main()
{
printf(%d\n,NUM(1,2,3));
printf(%s\n,STR(aa,bb,cc));
}
最后程序的輸出為:
123
aabbcc
千萬(wàn)別擔(dān)心,除非需要或者宏的用法恰好和手頭的工作相關(guān),否則很少有程序員會(huì)知道##運(yùn)算符。絕大多數(shù)程序員從來(lái)沒(méi)用過(guò)它。
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言教程匯總計(jì)算機(jī)等級(jí)考試二級(jí)C語(yǔ)言常見(jiàn)知識(shí)點(diǎn)總結(jié)
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |