#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}
上面的程序通過連接var和12打印100個c。g ## g2如何工作?#define f(g,g2)g ## g2
#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}
上面的程序通過連接var和12打印100個c。g ## g2如何工作?#define f(g,g2)g ## g2
##
只是將令牌粘貼在一起。這是一個預處理器指令。
E.g.
#define PASTE(a,b) a##b
int i=PASTE(1,2); /* int i=12; */
##
是預處理程序「命令」串聯前後會發生什麼。
所以預處理後,看起來就像這樣:
main()
{
int var12=100;
printf("%d",var12);
}
這是標記粘貼,對於GCC描述here。令牌粘貼由預處理器完成,而不是由編譯器完成。
由於您使用了##
命令,因此預處理器正在執行並置。
當您不確定預處理器在做什麼時,您可以在運行預處理器後要求gcc停止。由於這是在編譯器運行之前,所以輸出很容易理解。
例如,假設你有一個文件pre.c
#define FOO 123
#define CONCAT(x,y) x##y
#define STRING(x) #x
void main()
{
int a = FOO;
int b = CONCAT(123,4567);
char* c = STRING(IGetQuoted);
}
您可以通過將-E
選項GCC產生預處理輸出。
$ gcc -E pre.c
# 1 "pre.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "pre.c"
void main()
{
int a = 123;
int b = 1234567;
char* c = "IGetQuoted";
}
記住#include
將它指定了文件的內容拉,可以使預處理器輸出比較長。
-1(不是真的)用於'void main()'! – pmg 2009-11-28 20:29:53
這不是一個程序,它是一個宏。在您最喜愛的C/C++語言書中查找「令牌粘貼操作符」。 – 2009-11-28 19:24:08
@nobugz:什麼?上面的*是一個程序,儘管不是非常合法的C.程序打印100.程序中有一個宏,但在說「上面的程序打印100」時,Shishir沒有正確地指向整個計劃,而不是宏? – 2009-11-28 19:47:04