我正在嘗試爲其宏擴展測試gcc預處理器。GCC如何在宏中引用過程?
我寫下面的代碼:(只是用於測試)
#include <stdio.h>
#define QUOTE "
#define TMPL hello
int main(){
printf(QUOTE TMPL QUOTE);
return 0;
}
編譯結果是:
$ gcc main.c -o main
main.c:3:15: warning: missing terminating " character
main.c: In function ‘main’:
main.c:7: error: missing terminating " character
main.c:7: error: missing terminating " character
main.c:7: error: ‘hello’ undeclared (first use in this function)
main.c:7: error: (Each undeclared identifier is reported only once
main.c:7: error: for each function it appears in.)
main.c:7: warning: format not a string literal and no format arguments
main.c:7: warning: format not a string literal and no format arguments
$
然後我嘗試看看預處理的結果
$ gcc -E main.c -o tmp.c
main.c:3:15: warning: missing terminating " character
$
雖然發出警告,但它以某種方式在中產生正確的預處理代碼10
int main(){
printf(" hello ");
return 0;
}
我編譯tmp.c
,hello
被正確打印。
我想知道爲什麼gcc -E
可以產生正確的代碼,而使用gcc
直接編譯失敗。 gcc預處理器的兩種方法有什麼區別?
$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
預處理器宏應擴展爲一系列詞法分析令牌。所以你不能有像'#define QUOTE'這樣的宏';順便說一下,你的GCC版本很舊,現在的版本是4.8 –
你想谷歌「c預處理器字符串」 – ugoren