mikrocontroller.net

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


Autor: Pfupf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#define A 100
#define B 50

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


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

Autor: Pfupf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pfupf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pfupf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-fdump-tree-original tut was ich will. Danke.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.