簡體   English   中英

#define f(g,g2)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 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM