2017-05-14 8 views
5

私はcpp foo.cgcc -E foo.cの両方が同じ方法でソースファイルを前処理すると思っていましたが、同じファイルの出力が異なっていました。 cppため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); 

結果:gcc -Eためとclang -Eため

$ 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 -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

2つの違いは、gcc -E-traditional-cppを排除することです。このオプションを含めると、cppと同じ結果が得られます。

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

+0

確かに。 gccは '-no-traditional-cpp'がないので、このオプションをなくす方法はありますか? – Bilow

+0

私のワークステーションのようないくつかの 'cpp'プログラムのように見えますが、デフォルトでは' -traditional-cpp'に設定されていません。ですから、 'cpp'を呼び出すときに伝統的なモードを止めたいのであれば、どのようにすればいいのでしょうか? '-no-traditional-cpp'や' --no-traditional-cpp'を使用しようとすると、私のバージョンは文句を言います。 'gcc -E'を呼び出す代わりに、これはちょっとしたことです。 –

+0

@Bilow: 'gcc'は、特に指定されていない限り、通常それを削除します。 –

関連する問題