[英]#define f(g,g2) g##g2
#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}
上面的程序通過連接var和12來打印100 in c。g ## g2如何工作?
##
只是將令牌粘貼在一起。 它是一個預處理器指令。
例如
#define PASTE(a,b) a##b
int i=PASTE(1,2); /* int i=12; */
##
是預處理器“命令”,用於連接之前和之后的內容。
所以在預處理之后它將如下所示:
main()
{
int var12=100;
printf("%d",var12);
}
這是標記粘貼, 這里描述的是gcc。 令牌粘貼由預處理器完成,而不是編譯器。
由於您使用了##
命令,因此預處理器正在執行連接。
當您不確定預處理器正在做什么時,可以要求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
會引入它指定的文件的內容,並且可以使預處理器輸出相當長。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.