2016-11-18 35 views
0

請考慮下面的代碼如何#define預處理真正起作用用C

#define FIRSTNAME "" 
#define SECONDNAME "JOHN" 
# define PATHSAVE(a) func(strcat(strcpy(tmpFileName, appDir), a)) 
int main() { 
    PATHSAVE(FIRSTNAME SECONDNAME); 
} 

通過分析我發現價值「約翰」傳遞給函數PATHSAVE。 通過我不能明白爲什麼兩個參數在此功能PATHSAVE(名字SECONDNAME)

+0

你是不是傳遞2個參數。你傳遞了一個參數,它是'FIRSTNAME'和'SECONDNAME'連接的結果。不同的參數用逗號(',')分隔。 –

+0

發送這個[只通過預處理器*](http://stackoverflow.com/questions/4900870/can-gcc-output-c-code-after-preprocessing),並檢查輸出可能會回答你的問題。 – WhozCraig

+0

看起來這是一個字符串連接的例子。 – NathanOliver

回答

1
PATHSAVE(FIRSTNAME SECONDNAME); 

使用將擴大到PATHSAVE(「約翰」)作爲預處理器將concatinate 2串在一起。

這將被進一步擴大到

func(strcat(strcpy(tmpFileName, appDir), "JOHN")) 
2

你所寫的將被擴展如下

func(strcat(strcpy(tmpFileName, appDir), "" "JOHN")); 
             ^^ ^^^^^^ 
             || |||||| 
             || SECONDNAME 
             || 
             FIRSTNAME 

傳遞兩個參數給宏要求它們通過,被分開,而不是空間

1

如果您想知道發生了什麼,可以使用c預處理器。

我粘貼你的代碼在一個文件名爲ex.c,這裏是輸出:

CPP ex.c

# 1 "ex.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 1 "<command-line>" 2 
# 1 "ex.c" 



int main() { 
    func(strcat(strcpy(tmpFileName, appDir), "" "JOHN")); 
}