2013-01-25 9 views
13

Der g ++ - Compiler hat ein Flag, das Makro-expandierten Code (-E) erzeugt, also frage ich mich, ob es eine Möglichkeit gibt, das Programm nach der Template-Instanziierung anzuzeigen, bevor die eigentliche Kompilierung stattfindet?Ist es möglich, C++ - Code mit instanziierten Templates anzuzeigen, bevor es kompiliert wird (g ++)?

+2

Schade Template-Instantiierung ist * Teil * der eigentlichen Kompilierungsprozess ... und auch nicht einer am Anfang, es ist ein Schritt irgendwo in der Mitte. Vorlagen werden auch bei Bedarf instanziiert. – Xeo

+2

Kommentar von dem ziemlich dummen Teil meines Gehirns: benutze "g ++ -S" und inspiziere den generierten Assembler Code! –

+1

@Xeo Die fac, dass sie ein Teil des Kompilierungsprozesses sind, ist ein Problem sicher, aber dass sie bei Bedarf instanziiert werden, sehe ich nicht als ein Problem. Warum sollte es (hypothetisch) nicht möglich sein, eine separate .log-Datei mit instanziierten Templates (für diejenigen, die angefordert werden) auszugeben? Wäre es nicht ein wenig einfacher, Vorlagencodes zu debuggen? Fragen Sie einfach ... – tmaric

Antwort

7

Nun, je näher Sie erhalten können, ist der AST/ABT vom Compiler generierte zu lesen:

  • AST: Abstract Syntax-Baum
  • ABT: Abstract Tree Bindung

ehemaligen stellt die Ansicht der Syntax dar, wie der Compiler sie versteht und die letztere ähnlich ist nach Auflösung der Bindungen (dh, dass die a hier ist eigentlich die Variable, die 3 Zeilen zuvor deklariert wurde oder dass die foo der in diesem Header definierten Funktion entspricht ...).

Clang erlaubt es, seinen AST zu entladen ... was in Wirklichkeit der ABT ist, eigentlich wird er in diesem Moment verbessert; Sneak Entwickler-Vorschau:

int Test __attribute__((visibility("default"))); 

int main(int argc, char** argv) { 
    int x __attribute__((aligned(4))) = 5; 
    int y = 2; 
    for (;;) 
    if (x != y++) 
     break; 
    return (x * y); 
} 

enter image description here

Normalerweise sollten Sie sehen, wie die Vorlage dort instanziiert wurde.

Hinweis: Um es zu bekommen, brauchen Sie den -ast-dump Pass zum Clang-Front-End.

+2

Der Schlüssel hier ist wirklich _no_. :) –