2009-01-20 16 views
11

Dowiedziałem się, że kompilator rozwinie makra podczas kompilacji. Szablony są również rozszerzane w czasie kompilacji. Czy jest jakiś sposób, aby zobaczyć ten rozszerzony kod? Kompiluję używając Visual Studio 2008.Wyświetlanie rozszerzonego kodu kompilatora - C++

jakieś myśli?

+7

Należy zauważyć, że pytanie dotyczy również rozszerzenia szablonu, a wybrana odpowiedź nie odpowiada na to pytanie. – TripShock

+0

[Pokrewne pytanie] (http://stackoverflow.com/questions/5193867) ma bardziej przydatną (choć zależną od GCC) odpowiedź. Aby uzyskać bardziej zaawansowany kod języka C++ niż RTL, użyj rodziny opcji '-fdump-tree -... 'jak' -fdump-tree-gimple' zamiast '-fdump-rtl -...' w tej odpowiedzi. – Ruslan

Odpowiedz

10

VC++ kompilator (cl.exe) obsługuje kilka przełączników wiersza polecenia dla tego:

/E preprocess to stdout 
/P preprocess to file 
/EP preproscess to stdout with no #lines 

Dodatkowe przełączniki wiersza polecenia można dodawać we właściwościach projektu. W mojej wersji (VC2005), Opcje konfiguracji -> C/C++ -> Wiersz poleceń -> Dodatkowe opcje

2

Aby wysłać wstępnie przetworzony kod, należy zadzwonić bezpośrednio do cpp, używając opcji -E w gcc i pokrewnych kompilatorach; Jestem pewien, że inne kompilatory lub zestawy mają podobne rzeczy (tak jak w przypadku innej odpowiedzi to/E lub/P w VC++).

Nie jestem pewien, czy wyprowadzać instancjonowane szablony. Myślę, że jest to znacznie trudniejsze, ponieważ jest to raczej część kompilacji niż preprocessingu (przynajmniej w nowoczesnych kompilatorach, od oryginalnej wersji cfront, która była tłumaczką C++ do cc, o ile dobrze pamiętam).

10

Kompilator tak naprawdę nie wykonuje żadnego rozszerzenia makra. To jest zadanie pre-procesora. Wszystko to pojawia się jako jeden krok, ale kompilator faktycznie przekazuje oddzielne zadania przed procesorem i przechwytuje dane wyjściowe.

Szablony nie są "rozszerzane" podczas kompilacji. Są one tworzone przy użyciu podczas kompilacji. Różnica polega na tym, że kompilator natychmiast generuje kod obiektowy dla szablonu; nie ma pośredniego kodu źródłowego, który wychodzi. Nie można patrzeć na utworzony kod szablonu jako źródło, jest on odrzucany jako zespół, gdy jest potrzebny.

Jeśli masz GCC, możesz również wywołać procesor bezpośrednio bezpośrednio, używając "cpp" z właściwymi argumentami (najczęściej zawierają ścieżki i definicje makr linii poleceń). Inni odpowiedzieli na MSVC.

+0

Wywoływane podczas kompilacji, _ lub łączenia (jeśli (możesz) używać eksportu) – MSalters

+2

Zależy to od kompilatora - procesor wstępny działa tak, jak gdyby znajdował się w oddzielnym etapie, ale nie jest to konieczne, aby był oddzielnym programem. –

4

Zauważ, że/E w VC++ rozszerza jedynie oświadczenia preprocesora (czyli #include, #ifdef, #define itp)

nie jestem świadomy każdej nowoczesnej kompilatora, który pozwala rozszerzyć szablonów.

1

Łatwo jest dodać opcję do kompilatorów, aby pokazać wyjście po podstawieniu makra. Zdefiniowano to jako zwykłą opcję zamiany tekstu. Wiele kompilatorów implementuje to jako oddzielny etap, czasem nawet traktowany jako osobne narzędzie. W każdym przypadku wynikiem podstawienia makra jest zbiór jednostek tłumaczeniowych w formie tekstowej.

Szablony są kompilowane. Jest w tym wiele etapów. Nazwy są rozwiązywane dwukrotnie, na przykład. W obu etapach kompilator zapisuje wynik wyszukiwania nazwy. To jest wpis w tabeli. Jak pokazałbyś to w formie tekstowej? Nie ma tu trywialnego wyrażenia C++.

Powiązane problemy