Forum: Compiler & IDEs gcc preprozessor ausgabe mit ausgerechneten AusdrückenIch


von Pfupf (Gast)


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).

von Pfupf (Gast)


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?

von Karl H. (kbuchegg)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Es gibt x verschiedene -d-Optionen, mit denen man sich die Ergebnisse
der jeweiligen Zwischenschritte ansehen kann.

Allerdings sollte man als Nicht-Compiler-Bauer keine zu großen
Erwartungen in die Lesbarkeit dieser Dateien setzen. ;-)

von (prx) A. K. (prx)


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.

von Pfupf (Gast)


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.

von (prx) A. K. (prx)


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.

von Pfupf (Gast)


Lesenswert?

-fdump-tree-original tut was ich will. Danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.