2017-05-14 3 views
5

Ich dachte, dass sowohl cpp foo.c und gcc -E foo.c die Quelldatei auf die gleiche Weise vorverarbeiten, aber ich habe ihre Ausgabe für die gleiche Datei zu unterscheiden.Unterschied zwischen cpp und 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); 

Ergebnis für 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; 

$ 

Ergebnis für gcc -E und für clang -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; 
$ 

Warum diese Ausgänge unterscheiden und welche sollte ich verwenden, wenn ich das sehen wollen vorverarbeitete Quelle?

Originalcode here

+0

Ich habe es gerade versucht. Meine Version von 'cpp' erzeugt eine identische Ausgabe wie' gcc -E '. Genau wie Ihre 'gcc' Ausgabe. – selbie

+2

Ich bekomme die gleichen Ergebnisse mit 'cpp foo.c' wie mit' gcc -E foo.c'. Kannst du die Ausgabe von 'cpp -v foo.c' in die Frage einfügen? –

+1

Wenn ich '--traditional-cpp' als Befehlszeilenparameter für cpp verwende, erhalte ich die gleiche Ausgabe wie deine. Sieht so aus, als hätte jemand das bereits als mögliche Antwort identifiziert. – selbie

Antwort

2

Der Unterschied zwischen den beiden ist, dass gcc -E-traditional-cpp beseitigt. Wenn Sie die Option angeben, erhalten Sie das gleiche Ergebnis wie cpp.

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

+0

In der Tat. Wie schafft es GCC, diese Option zu eliminieren, da es kein "-no-traditio- nal-cpp" gibt? – Bilow

+0

Sieht so aus, als ob einige 'cpp'-Programme (wie das auf meiner Workstation) nicht standardmäßig auf '-traditional-cpp' gebaut sind. Also, wenn Sie den traditionellen Modus ausschalten möchten, wenn Sie 'cpp' aufrufen, irgendeine Idee, wie es geht? Meine Version beklagt sich, wenn ich versuche, -no-traditio- nelle-cpp' oder '-no-traditional-cpp' zu verwenden. Das ist nur akademisch für mich, seit "gcc -E" aufzurufen, anstatt den Trick. –

+0

@Bilow: 'gcc' eliminiert es normalerweise, wenn nicht anders angegeben. –

Verwandte Themen