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