【问题标题】:Difference between cpp and gcc -Ecpp和gcc -E的区别
【发布时间】:2017-10-13 12:40:44
【问题描述】:

我认为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;
$

为什么这些输出不同,当我想查看预处理源时应该使用哪一个?

原码here

【问题讨论】:

  • 我刚试过这个。我的cpp 版本产生与gcc -E 相同的输出。与您的 gcc 输出相同。
  • 我得到与cpp foo.cgcc -E foo.c 相同的结果。可以将cpp -v foo.c 的输出粘贴到问题中吗?
  • 如果我使用 --traditional-cpp 作为 cpp 的命令行参数,我会得到与你相同的输出。看起来有人已经确定这是一个可能的答案。
  • cpp -v foo.c 的第一行是Apple LLVM version 8.0.0 (clang-800.0.42.1)。其余的输出相当冗长

标签: c gcc c-preprocessor preprocessor


【解决方案1】:

两者的区别在于gcc -E会消除-traditional-cpp。如果您包含该选项,那么您应该会收到与cpp 相同的结果。

https://gcc.gnu.org/onlinedocs/cpp/Traditional-Mode.html

【讨论】:

  • 确实如此。由于没有-no-traditional-cpp,gcc 如何设法消除此选项?
  • 看起来一些cpp 程序(比如我工作站上的那个)不是默认为-traditional-cpp。因此,如果您想在调用cpp 时关闭传统模式,您知道该怎么做吗?如果我尝试使用-no-traditional-cpp--no-traditional-cpp,我的版本会报错。这对我来说只是学术性的,因为调用 gcc -E 可以解决问题。
  • @Bilow: gcc 通常会消除它,除非另有说明。
  • 我将使用gcc -E,但我仍然想知道 gcc 是如何消除 -traditional-cpp 的,因为我不能在命令行中这样做
  • 谢谢大家的回答
猜你喜欢
  • 2018-05-30
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2010-12-14
相关资源
最近更新 更多