Jak wyświetlić plik źródłowy C / C ++ po wstępnym przetwarzaniu w Visual Studio?

206

Załóżmy, że mam plik źródłowy z wieloma dyrektywami preprocesora. Czy można zobaczyć, jak to wygląda po zakończeniu pracy preprocesora?

Geo
źródło
Byłoby to pomocne, jeśli podałeś więcej informacji, takich jak używany kompilator.
JaredPar,
Obecnie używam Visual Studio 2005 jako mojego IDE.
Geo
Następnie domyślnie używasz kompilatora cl.exe.
Martin York,
3
Dlaczego odpowiedź gcc została zaakceptowana, gdy powiedział, że używa VS2005?
Jim Buck
Powiązane: Informacje o kompilatorze .
Laurie Stearn

Odpowiedzi:

147

cl.exe, interfejs wiersza polecenia do Microsoft Visual C ++, ma trzy różne opcje wyprowadzania wstępnie przetworzonego pliku (stąd niespójność w poprzednich odpowiedziach na temat Visual C ++):

Jeśli chcesz wstępnie przetworzyć plik bez dyrektyw #line, połącz opcje /Pi /EP.

bk1e
źródło
1
Jak przekazać te polecenia do projektu z nmake i Makefile?
WooDzu,
@WooDzu Użyj NMAKE (nmake.exe) do automatyzacji zadań budujących projekty Visual C ++ przy użyciu tradycyjnego makefile. ~ msdn.microsoft.com/en-us/library/f35ctcxw.aspx
G.Rassovsky
8
Pamiętaj, że /Pspowoduje to wyłączenie generowania plików obj. Więc jeśli umieścisz /Popcje, możesz otrzymać błąd łącza informujący, że nie można znaleźć niektórych plików obj, ponieważ w rzeczywistości nie jest generowany.
smwikipedia,
Upewnij się, że jesteś w, VS Developer command prompta NIE w, Command promptgdy próbujesz użyć MS kompilatora ( cl). Kompilator nie jest dostępny w konwencjonalnym wierszu poleceń.
dmytro.poliarush,
Społeczność VS2019: Błąd / P LNK 1104 jest nadal gorący w prasie.
Laurie Stearn
119

Większość kompilatorów ma opcję uruchomienia preprocesora. np. gcc zapewnia -E:

   -E  Stop after the preprocessing stage; do not run the compiler proper.  
       The output is in the form of preprocessed source code, which is sent
       to the standard output.

Możesz więc po prostu uruchomić:

gcc -E foo.c

Jeśli nie możesz znaleźć takiej opcji, możesz po prostu znaleźć preprocesor C na swoim komputerze. Zwykle nazywa się to cpp i prawdopodobnie jest już na twojej ścieżce. Wywołaj to w ten sposób:

cpp foo.c

Jeśli istnieją nagłówki, które musisz dołączyć z innych katalogów, możesz przekazać -I / path / to / include / dir do każdego z nich, tak jak w przypadku zwykłej kompilacji.

W przypadku systemu Windows pozostawię to innym plakatom, aby udzielili odpowiedzi, ponieważ nie jestem tam ekspertem.

Todd Gamblin
źródło
2
pytanie gcc: stackoverflow.com/questions/3916979/...
Ciro Santilli 17 冠状 病 六四 事件 法轮功 法轮功
100

Kliknij prawym przyciskiem myszy plik w Eksploratorze rozwiązań, przejdź do Właściwości. W obszarze Właściwości konfiguracji -> C / C ++ -> Preprocesor, „Generuj wstępnie przetworzony plik” jest tym, czego szukasz. Następnie kliknij prawym przyciskiem myszy plik w Eksploratorze rozwiązań i wybierz „Kompiluj”. Wstępnie przetworzony plik jest tworzony w katalogu wyjściowym (np. Release, Debug) z rozszerzeniem .i (dzięki Steedowi za jego komentarz).

Jim Buck
źródło
9
„Przetwarzanie wstępne do pliku” w VS2010.
Rob W
18
BTW, plik zostanie utworzony w katalogu wyjściowym (np Release, Debug) z rozszerzeniem .i.
Rumak
1
To bardzo pomaga, ponieważ używa konfiguracji kompilacji już skonfigurowanej w projekcie, aby znaleźć wszystkie właściwe nagłówki.
IanH,
Uwaga: w przypadku MSVC 2015 plik .i nie znajdował się w katalogu wyjściowym , ale w katalogu pośrednim projektu . Nie są takie same, jeśli np. Generujesz projekty za pomocą CMake.
user1556435,
19

Zwykle musisz wykonać przetwarzanie końcowe na wyjściu preprocesora, w przeciwnym razie wszystkie makra rozwijają się do jednego wkładki, co jest trudne do odczytania i debugowania. W przypadku kodu C wystarczy coś takiego:

gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c

W przypadku kodu C ++ jest to o wiele trudniejsze. W przypadku GCC / g ++ ten skrypt Perla był przydatny.

ididak
źródło
8

Nic nie wiem o kompilatorze Microsoft, ale w GCC możesz użyć tego:

gcc -E -P -o result.c my_file.h

Jeśli chcesz zobaczyć komentarze, użyj tego:

gcc -E -C -P -o result.c my_file.h

Więcej opcji dostępnych na tej stronie .

dzav
źródło
1
Działa to również z kompilatorami pochodzącymi z gcc, takimi jak qcc.exe - dzięki!
mędrzec
8

Spróbuj, cl /EPjeśli używasz kompilatora C ++ firmy Microsoft.

Kod Atemp
źródło
6

W Visual Studio możesz skompilować plik (lub projekt) za pomocą / P.

Andreas Magnusson
źródło
5

Jak odpowiedzieli bk1e i Andreas M., opcja / P kompilatora spowoduje wstępne przetworzenie pliku. Jednak w moim projekcie wykorzystującym VS2005 i platformę Builder (dla wbudowanego procesora ARM) projekt nie przedstawił opcji w oknie dialogowym (zgodnie z opisem Jima B), aby włączyć tę opcję.

Mogłem uruchomić CL ręcznie i dodać / P, ale to się nie udało, ponieważ nie znałem wszystkich odpowiednich opcji wiersza poleceń, które były niewidocznie aktywowane przez Konstruktora platform podczas pełnej kompilacji. Musiałem więc poznać wszystkie te opcje.

Moje rozwiązanie polegało na przejrzeniu pliku build.log i znalezieniu wykonanej linii

CL blah-blah-blah myfile.c

Skopiowałem tę linię do schowka. Część „bla-bla-bla” zawierała opcje budowy i była ogromna.

Z powrotem w IDE, kliknąłem prawym przyciskiem myszy na myfile.c, wybrałem „Otwórz okno kompilacji”, a następnie w tym oknie wkleiłem linię komend kompilacji i dodałem „/ P”.

CL /P blah-blah-blah myfile.c

Gotowe. Plik myfile.i został utworzony i zawierał dane wyjściowe preprocesora.

Sam Pittman
źródło
2

CPIP to nowy preprocesor C / C ++ napisany w języku Python. Jeśli chcesz uzyskać szczegółową reprezentację wizualną wstępnie przetworzonego pliku, wypróbuj go.

CPIP jest preprocesorem C / C ++ zaimplementowanym w Pythonie. Większość procesorów wstępnych uważa przetwarzanie wstępne za brudne zadanie, które należy wykonać jak najszybciej. Może to bardzo utrudnić wyśledzenie subtelnych defektów na etapie wstępnego przetwarzania, ponieważ preprocesory wyrzucają wiele użytecznych informacji na rzecz uzyskania jak najtańszego wyniku.

Niewielu programistów naprawdę rozumie przetwarzanie wstępne, dla wielu jest to niejasna odrobina czarnej magii. CPIP ma to poprawić i rejestrując każdy szczegół przetwarzania wstępnego, dzięki czemu CPIP może uzyskać cudownie wizualne informacje na temat zależności plików, użycia makr i tak dalej.

CPIP nie został zaprojektowany jako zamiennik cpp (lub jakiegokolwiek innego ustalonego preprocesora), zamiast tego CPIP uważa jasność i zrozumienie za ważniejsze niż szybkość przetwarzania.

thegreendroid
źródło
2

W systemie operacyjnym Windows prostą odpowiedzią na to pytanie w jednym wierszu jest użycie poniższego polecenia w wierszu polecenia DOS, aby wyświetlić wstępnie przetworzony plik:

CL /P /C myprogram.c

Spowoduje to wygenerowanie pliku o nazwie myprogram.i . Otwórz i wypatruj rozszerzonych preprocesorów.

manty
źródło