天天看點

#、##和__VA_ARGS__

#
假如希望在字元串中包含宏參數,ANSI C允許這樣作,在類函數宏的替換部分,#符号用作一個預處理運算符,它可以把語言符号轉化程字元串。例如,如果x是一個宏參量,那麼#x可以把參數名轉化成相應的字元串。該過程稱為字元串化(stringizing).
#incldue <stdio.h>
#define PSQR(x) printf("the square of" #x "is %d.\n",(x)*(x))
int main(void)
{
    int y =;
    PSQR(y);
    PSQR(+);
    return ;
}
輸出結果:
the square of y is 
the square of + is 
第一次調用宏時使用“y”代替#x;第二次調用時用“2+4"代#x。
##
##運算符可以用于類函數宏的替換部分。另外,##還可以用于類對象宏的替換部分。這個運算符把兩個語言符号組合成單個語言符号。例如:
#define XNAME(n) x##n
這樣宏調用:
XNAME()
展開後:
x4
程式:
#include <stdio.h>
#define XNAME(n) x##n
#define PXN(n) printf("x"#n" = %d\n",x##n)
int main(void)
{
    int XNAME()=;//int x1=12;
    PXN();//printf("x1 = %d\n", x1);
    return ;
}
輸出結果:
x1=
可變參數宏 ...和_ _VA_ARGS_ _
__VA_ARGS__ 是一個可變參數的宏,很少人知道這個宏,這個可變參數的宏是新的C99規範中新增的,目前似乎隻有gcc支援(VC6的編譯器不支援)。
實作思想就是宏定義中參數清單的最後一個參數為省略号(也就是三個點)。這樣預定義宏_ _VA_ARGS_ _就可以被用在替換部分中,替換省略号所代表的字元串。比如:
#define PR(...) printf(__VA_ARGS__)
int main()
{
    int wt=,sp=;
    PR("hello\n");
    PR("weight = %d, shipping = %d",wt,sp);
    return ;
}
輸出結果:
hello
weight = , shipping = 
省略号隻能代替最後面的宏參數。
#define W(x,...,y)錯誤!
           

轉載自http://www.cnblogs.com/zhujudah/archive/2012/03/22/2411240.html

在此表示真誠的感謝!