CPP和GCC-E之间的区别

9

我曾认为cpp foo.cgcc -E foo.c两者对源文件的预处理方式相同,但是我发现它们对于同一个文件的输出结果不同。

$ cat foo.c
#define VARIABLE 3
#define PASTER(x,y) x ## _ ## y
#define EVALUATOR(x,y)  PASTER(x,y)
#define NAME(fun) EVALUATOR(fun, VARIABLE)

extern void NAME(mine);

cpp的结果:

$ cpp foo.c
# 1 "foo.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 329 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "foo.c" 2





extern void mine ## _ ## 3;

$

gcc -Eclang -E 的结果:

$ gcc -E foo.c
# 1 "foo.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 330 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "foo.c" 2





extern void mine_3;
$

为什么这些输出不同,当我想要查看预处理后的源代码时应该使用哪一个?
原始代码在这里

我刚试了一下。我的 cpp 版本生成的输出与 gcc -E 相同。与你的 gcc 输出相同。 - selbie
2
我使用 cpp foo.cgcc -E foo.c 得到了相同的结果。你能把 cpp -v foo.c 的输出粘贴到问题中吗? - Michael Burr
1
如果我在cpp的命令行参数中使用--traditional-cpp,我会得到与您相同的输出。看起来有人已经将其确定为可能的答案了。 - selbie
cpp -v foo.c 的第一行是 Apple LLVM version 8.0.0 (clang-800.0.42.1)。其余输出内容相当冗长。 - Bilow
1个回答

4

确实。由于没有“-no-traditional-cpp”选项,gcc是如何消除此选项的? - Bilow
1
看起来一些 cpp程序(就像我工作站上的那个)是构建为不默认使用-traditional-cpp。所以如果您想在调用cpp时关闭传统模式,有什么想法呢?我的版本如果我尝试使用-no-traditional-cpp--no-traditional-cpp会发出警告。对我来说这只是学术性质,因为使用gcc -E代替就能达到同样的效果了。 - Michael Burr
@Bilow:gcc通常会消除它,除非另有规定。 - l'L'l
1
我将使用 gcc -E,但我仍然想知道 gcc 如何消除 -traditional-cpp,因为我无法在命令行中执行此操作。 - Bilow
1
谢谢大家的回答。 - Bilow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接