gcc preprozessor ausgabe mit ausgerechneten AusdrückenIch

Gast #1649689
Lesenswert?

Ich meine von früher (bei irgendeinem C-Compiler) eine Option zu kennen, 
mit der man sich eine C-Datei nach Ersetzung der defines ausgeben lassen 
kann.

Mit gcc --save-temps geht das auch soweit, das die defines ersetzt 
werden, aber da ich die sich ergebenden Werte prüfen möchte, hätte ich 
auch gerne gesehen, was sich beim ausrechnen von konstanten Ausdrücken 
ergibt.

Z.B. so

h-Datei
1
#define A 100
2
#define B 50

c-Datei:
1
int main () {
2
  unsigned int a = A - B;
3
}

Als Ergebnis erhalte ich in der i-Datei:

.
.
.
a = 100 - 50;
.
.
.

Gibt es eine Option in der er dann auch die Differenz ausrechnet?
Mit gcc --help finde ich leider nichts passendes.

Hier ist das zugegebenermaßen noch mit dem Kopf zu rechnen aber in der 
realen Anwenundung habe ich mehrere Dutzen wesentlich komplexere 
Ausdrücke (die aber letztlich konstant sind).
Gast #1649703
Lesenswert?

Oh. Da bin ich gerade auf ein weiteren Seite gestossen, die sagt, das 
ich eben mit -E nur den Textersatz angezeigt bekomme. Die konstanten 
Ausdrücke werden da noch nicht ausgerechnet.

OK. Aber gibt es einen Weg dahin, den C-Quelltext mit ausgerechneten 
konstanten Ausdrücken zu sehen?
#1649707
Lesenswert?

Pfupf schrieb:
> Oh. Da bin ich gerade auf ein weiteren Seite gestossen, die sagt, das
> ich eben mit -E nur den Textersatz angezeigt bekomme. Die konstanten
> Ausdrücke werden da noch nicht ausgerechnet.
>
> OK. Aber gibt es einen Weg dahin, den C-Quelltext mit ausgerechneten
> konstanten Ausdrücken zu sehen?

Das Ausrechnen von konstanten Ausdrücken ist Sache des Compilers, 
genauer des Optimizers, genauer der Stufe 'Constant Folding' im 
Optimizer des Compilers. Wenn du daher den Optimizer nicht aktiviert 
hast, ist es sehr wahrscheinlich, dass die Konstanten gar nicht 
zusammengefasst werden.

Vielleicht findest du einen SChalter, mit dem du dir die interne 
Programmstruktur ansehen kannst. Oder aber du lässt dir ein Assembler 
Listing erzeugen. Dort siehst du dann auch, was dabei raus kommt.
#1649732
Lesenswert?

Karl heinz Buchegger schrieb:

> Wenn du daher den Optimizer nicht aktiviert
> hast, ist es sehr wahrscheinlich, dass die Konstanten gar nicht
> zusammengefasst werden.

Es ist ziemlich wahrscheinlich, dass sie trotzdem zusammengefasst 
werden, wenn auch nicht unbedingt in exakt gleichem Umfang wie bei 
eingeschaltetem Optimizer. Die einfache Berechnung konstanter (Teil-) 
Ausdrücke ergibt sich nämlich ziemlich zwanglos als Nebenjob jenes Teils 
im Compiler, der den Baum, der zunächst aus einem Ausdruck wird, von 
unten nach oben mit der Typinformation bereichert.
Gast #1649736
Lesenswert?

Nun, falls es an der Option fehlt, das er die Vereinfachung macht, werde 
ich das noch finden.

Mein Hauptproblem ist es aber einen C-Text zu erhalten, der die 
vereinfachten Werte enthält.

Assembler output hat leider den Nachteil, das es bei 10 oder 20 defines 
schwierig wird, festzustellen, welches define denn da nun gerade 
behandelt wird. Man sieht ja nur die Stackposition oder evtl. ein 
Register als Ziel.
#1649743
Lesenswert?

Pfupf schrieb:

> Mein Hauptproblem ist es aber einen C-Text zu erhalten, der die
> vereinfachten Werte enthält.

Auch wenn das entsprechende Gerücht noch so oft in Foren verbreitet wird 
führt der Präprozessor nur bei #if eigenständige Berechnungen durch. 
Daher wird es bei keinem Compiler eine Option geben, die den durch den 
Präprozessor vorverarbeiteten Quelltext mit vorberechneten 
Konstantenausdrücken auswirft. Im Output des Präprozessors (gcc -E) 
stehen die Ausdrücke völlig unberechnet drin.

Wenn es darum geht, dass du selbst lesen willst, was der Compiler bei 
solchen Ausdrücken sieht, dann kommst du bei GCC dem mit der Option 
-fdump-tree-original noch am nächsten (=> source.c.003t.original). 
Anders als die -d Optionen aus der späteren Phase ist das auch noch 
lesbar.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren