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
intmain(){
2
unsignedinta=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).
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?
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.
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. ;-)
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.
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.
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.
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.