和可變引數巨集 VA ARGS

2021-06-05 19:37:20 字數 1112 閱讀 3797

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

可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如...

可變引數巨集 VA ARGS

可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadicmacros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 ...

可變引數巨集 VA ARGS

可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如...