1.#
假如希望在字串中包含巨集引數,ansi c允許這樣作,在類函式巨集的替換部分,#符號用作乙個預處理運算子,它可以把語言符號轉化程字串。例如,如果x是乙個巨集參量,那麼#x可以把引數名轉化成相應的字串。該過程稱為字串化(stringizing).
#incldue
#define psqr(x) printf("the square of" #x "is %d.\n",(x)*(x))
int main(void)
輸出結果:
the square of y is 16.
the square of 2+4 is 36.
第一次呼叫巨集時使用「y」代替#x;第二次呼叫時用「2+4」代#x。
2.##
##運算子可以用於類函式巨集的替換部分。另外,##還可以用於類物件巨集的替換部分。這個運算子把兩個語言符號組合成單個語言符號。例如:
#define xname(n) x##n
這樣巨集呼叫:
xname(4)
展開後:
x4 程式:
#include
#define xname(n) x##n
#define pxn(n) printf("x"#n" = %d\n",x##n)
int main(void)
輸出結果:
x1=12
3.可變引數巨集 …和_ va_args _
va_args是乙個可變引數的巨集,很少人知道這個巨集,這個可變引數的巨集是新的c99規範中新增的,目前似乎只有gcc支援(vc6.0的編譯器不支援)。
實現思想就是巨集定義中引數列表的最後乙個引數為省略號(也就是三個點)。這樣預定義巨集_ va_args _就可以被用在替換部分中,替換省略號所代表的字串。比如:
#define pr(...) printf(__va_args__)
int main()
輸出結果:
hello
weight = 1, shipping = 2
省略號只能代替最後面的巨集引數。
#define w(x,…,y)錯誤!
學習驗證截圖:
好久沒有學習了,看到好的趕緊學習後分享一下!
巨集定義中的可變引數 VA ARGS
include define debug fmt,printf fmt,va args intmain 輸出 you know i am handsome1000,1.100000 10這裡的 va args 其實就是指代 三個省略號的內容了,這就是這個結構的主體內容,基本已經成功了解了。然後程式在...
可變引數巨集定義 VA ARGS
1 使用va args define log printf va args define log err format,printf err format n va args define log err format,printf err format n va args 標準c要求至少帶有乙個引...
和可變引數巨集 VA ARGS
1.的用法 假如希望在字串中包含巨集引數,ansi c允許這樣作,在類函式巨集的替換部分,符號用作乙個預處理運算子,它可以把語言符號轉化程字串。例如,如果x是乙個巨集參量,那麼 x可以把引數名轉化成相應的字串。該過程稱為字串化 stringizing incldue define psqr x pr...