2017-05-14 82 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'通常會消除它。 –