【发布时间】:2013-06-28 04:53:39
【问题描述】:
我正在尝试测试 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
$
虽然给出了警告,但它以某种方式在tmp.c 中生成了正确的预处理代码
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 preprocessor stringize”。