2017-05-14 143 views
5

我以为cpp foo.cgcc -E foo.c都以同样的方式对源文件进行预处理,但是我得到的输出对于同一个文件是不同的。cpp和gcc之间的区别-E

$ 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

+0

我刚试过这个。我的'cpp'版本产生与'gcc -E'相同的输出。和你的'gcc'输出一样。 – selbie

+2

与'gcc -E foo.c'一样,'cpp foo.c'的结果也一样。你可以将'cpp -v foo.c'的输出粘贴到问题中吗? –

+1

如果我使用'--traditional-cpp'作为cpp的命令行参数,我会得到和你一样的输出。看起来喜欢有人已经确定这是一个可能的答案。 – selbie

回答

2

这两者之间的区别是,gcc -E将消除-traditional-cpp。如果包含该选项,那么您应该收到与cpp相同的结果。

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

+0

的确。因为没有'-no-traditional-cpp',gcc如何设法消除这个选项? – Bilow

+0

看起来像一些'cpp'程序(就像我的工作站上的程序)不会默认为'-traditional-cpp'。所以如果你想在调用'cpp'的时候关闭传统模式,想知道怎么做?我的版本抱怨,如果我尝试使用'-no-traditional-cpp'或'--no-traditional-cpp'。这对我来说只是学术,因为调用'gcc -E'代替了这个技巧。 –

+0

@Bloow:除非另有说明,'gcc'通常会消除它。 –

相关问题