C++ Source Code kurz orm kompilieren abfangen?
-
Hallo Forum,
wie kann ich den Sourcecode abfangen wie er kurz vor dem Kompilieren aussieht? Ich hoffe das dann im Source alle Konstanten durch Ihre Werte ersetzt sind, alle Header, etc eingearbeitet sind, ...
Ich habe beim cl Kompiler schon die /P Option gefunden (Der Preprozessor geht über den Source rüber.). Aber dort sind noch nicht die Konstanten eingesetzt. Habt Ihr eine Idee?
Viele Grüße
Herfried
-
AFAIK gibts sowas nicht... nach dem Praeprozessor-Durchlauf rennt der Compiler gleich ueber den ganzen Source. Du koenntest hoechstens noch den generierten Assembler ausgeben lassen. Beim GCC geht das mit der -s Option, beim cl weiss ich's nicht
-
Schade. Ich dachte es gäbe vielleicht eine Möglichkeit nach der Optimierung den Source nach halbwegs lesbar (nicht Bytecode) auszugeben. Mit der /c Option wird der source Modulweise kompiliert. Weiß jemand wie ich nun herausfinden kann welcher Funktionsaufruf mit welchen Parametern wo steht?
Herfried
-
Die Frage gabs AFAIR schon mal. Forensuche hilft.
-
Beim GCC kannst du mit der -S Option dir Assemblercode ausgeben lassen oder bist du nur an Lösungen für den cl (MSVC++) interessiert?
-
@Walli:
Mit der Suche stimmt was nicht? Ich habe gerade versucht im MFC Forum nach int zu suchen. Sieht so aus als wenn dort noch niemand einen "int" verwendet hat.@kingruedi: Eigentlich bin ich nur an Lösungen für den Microsoft Kompiler interessiert. Der MFC Source wird sich nicht so einfach vom GCC kompilieren lassen.
-
Herfried Gummer schrieb:
Der MFC Source wird sich nicht so einfach vom GCC kompilieren lassen.
Ist der dermaßen Standardinkompatibel?
Das was du suchst, gibt es nicht. Optimieren tut der Comiler und dieser erzeugt Binärcode.
-
Es gibt doch den Zwischencode. Das ist noch kein Binärcode. Den könnte man sich ausgeben lassen. Und sowas wie Konstanten soweit wie möglich einzusetzen sollte nicht schwer sein und jeder Kompiler machen.
-
Es gibt für C++ zwei Übersetzungsmodele:
1. Code => Preprocessor => Preprocesster Code => Compiler => Asm code => Assembler => Objekt Datei(en) => Linker => Exe
2. Code => Preprocessor => Preprocesster Code => C++ Compiler => C Code (=> Preprocessor => Preprocesster Code) => C compiler => Asm code => Assembler => Objekt Datei(en) => Linker => ExeNumber 1 ist das geläufigste Model. Bei Number 2 sind mir 2 Compiler bekannt Cfront und Comeau. Ersterer wird meines Wissen nach nicht mehr weiter entwickelt.
Dann gibt es noch MSs C++/CLI welches AFAIK ähnlich wie Java zu Bytecode compiliert welches dann von einer Virtuellen Maschine interpretiert wird. Meiner Meinung nach kann man C++/CLI auf Grund der vielen Erweiterungen nicht mehr als C++ bezeichen.
-
Es gibt zwei Formen von Konstanten:
#define foo 1 const int foo = 1;
Erstere werden durch den Präprozessor ersetzt. Das ist das was du vermutlich meinst. Zweitere sind für den Compiler konst. Variablen die erst beim compilieren berücksichtig werden => Binärcode.
Ein weiteres Zwischenformat ist mir nicht bekannt.
-
Ben04 schrieb:
Es gibt für C++ zwei Übersetzungsmodele:
es gibt auch welche die machen gleich .obj-files, ohne den asm zwischenschritt
-
Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum MFC mit dem Visual C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Bei MSVC6 gibts die Compiler-Schalter:
- /E
- /P
- /EP
Lies dir mal die Hilfe dazu durch das könnte möglicherweise was für dich sein.
-
@Readhead: Das kannte ich schon. Da läuft nur der Preprozessor rüber und ersetzt alle defines und baut alles zu einem großen stück source zusammen. Mir geht es aber darum die constanten Strings die bei einem bestimmten Funktionsaufruf verwendet werden herauszufiltern. Der Kompiler wird die wohl alle soweit es geht schon zur Compiletime sustitutieren.
Der Cameau Kompiler ist nicht frei. Außerdem scheint er auch keine Optimierung in meinem Sinne vorzunehmen...
Momentan bin ich dabei die einzelnen obj Dateien (zu jeder cpp) zu analysieren. Ist wohl die einzige Möglichkeit...
-
net schrieb:
Ben04 schrieb:
Es gibt für C++ zwei Übersetzungsmodele:
es gibt auch welche die machen gleich .obj-files, ohne den asm zwischenschritt
Bei GCC kannst du auch per
g++ -o test.exe test.cpp
alles in einem Befehl machen
Was ich meinte waren die zwischen Dateien die erzeugt werden. Natürlich kann man dem Compiler auch sagen er solle sie wieder löschen oder gar nicht erst erstellen und den Code per Stream weitergeben allerdings das heist ja nicht, dass es sie nicht gibt.