經常看到別人寫的**中define有特殊操作符#和##。接下來就讓我們看看他們代表的具體意思:
(1)#
假如希望在字串中包含巨集引數,ansi c允許這樣作,在類函式巨集的替換部分,#符號用作乙個預處理運算子,它可以把語言符號轉化程字串。例如,如果x是乙個巨集參量,那麼#x可以把引數名轉化成相應的字串。該過程稱為字串化。
例如:
#incldue #define psqr(x) printf("the square of" #x "is %d.\n",(x)*(x))
int main(void)
(2)##
##運算子可以用於類函式巨集的替換部分。另外,##還可以用於類物件巨集的替換部分。這個運算子把兩個語言符號組合成單個語言符號。
例如:
#include #define xname(n) x##n
#define pxn(n) printf("x"#n" = %d\n",x##n)
int main(void)
(3)可變引數巨集 …和__va_args__
__va_args__ 是乙個可變引數的巨集,很少人知道這個巨集,這個可變引數的巨集是新的c99規範中新增的,目前似乎只有gcc支援(vc6.0的編譯器不支援)。
實現思想就是巨集定義中引數列表的最後乙個引數為省略號(也就是三個點)。這樣預定義巨集__va_args__就可以被用在替換部分中,替換省略號所代表的字串。
例如:
#define pr(...) printf(__va_args__)
int main()
省略號只能代替最後面的巨集引數。
#define w(x,…,y)錯誤!
但是支援#define w(x, …),此時傳入的引數個數必須能夠匹配。
這裡再介紹幾個系統的巨集:
1) __va_args__ 是乙個可變引數的巨集,很少人知道這個巨集,這個可變引數的巨集是新的c99規範中新增的,目前似乎只有gcc支援(vc6.0的編譯器不支援)。巨集前面加上##的作用在於,當可變引數的個數為0時,這裡的##起到把前面多餘的」,」去掉的作用,否則會編譯出錯, 你可以試試。
2) __file__ 巨集在預編譯時會替換成當前的源檔名
3) __line__巨集在預編譯時會替換成當前的行號
4) __function__巨集在預編譯時會替換成當前的函式名稱
define中 和 的作用
define f a,b a b define d a a define s a d a void main void 輸出結果 f a,b ab分析 把兩個符號連起來 a指把a當成符號,就是把 後面的看成字串 和 操作符是和 define巨集使用的.使用 使在 後的首個引數返回為乙個帶引號的字串....
define中 和 的作用
define f a,b a b define d a a define s a d a void main void 輸出結果 f a,b ab分析 把兩個符號連起來 a指把a當成符號,就是把 後面的看成字串 和 操作符是和 define巨集使用的.使用 使在 後的首個引數返回為乙個帶引號的字串....
C語言巨集 define中 , , 和 的用法
作用 將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。如 define example instr printf the input string is t s n instr define example1 instr...