2009-11-28 53 views
5
#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

+2

這不是一個程序,它是一個宏。在您最喜愛的C/C++語言書中查找「令牌粘貼操作符」。 – 2009-11-28 19:24:08

+2

@nobugz:什麼?上面的*是一個程序,儘管不是非常合法的C.程序打印100.程序中有一個宏,但在說「上面的程序打印100」時,Shishir沒有正確地指向整個計劃,而不是宏? – 2009-11-28 19:47:04

回答

8

##只是將令牌粘貼在一起。這是一個預處理器指令。

E.g.

#define PASTE(a,b) a##b 

int i=PASTE(1,2); /* int i=12; */ 
0

##是預處理程序「命令」串聯前後會發生什麼。

0

所以預處理後,看起來就像這樣:

main() 
{ 
int var12=100; 
printf("%d",var12); 
} 
0

這是標記粘貼,對於GCC描述here。令牌粘貼由預處理器完成,而不是由編譯器完成。

0

由於您使用了##命令,因此預處理器正在執行並置。

當您不確定預處理器在做什麼時,您可以在運行預處理器後要求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將它指定了文件的內容拉,可以使預處理器輸出比較長。

+0

-1(不是真的)用於'void main()'! – pmg 2009-11-28 20:29:53

相關問題