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?
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?
Odpowiedzi:
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 ++):
/E
: proces wstępny do standardowego wyjścia (podobny do opcji -E GCC)/P
: proces wstępny do pliku/EP
: przetwarzanie wstępne na standardowe wyjście bez dyrektyw #lineJeśli chcesz wstępnie przetworzyć plik bez dyrektyw #line, połącz opcje /P
i /EP
.
/P
spowoduje to wyłączenie generowania plików obj. Więc jeśli umieścisz /P
opcje, 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.
VS Developer command prompt
a NIE w, Command prompt
gdy próbujesz użyć MS kompilatora ( cl
). Kompilator nie jest dostępny w konwencjonalnym wierszu poleceń.
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.
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).
Release
, Debug
) z rozszerzeniem .i
.
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.
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 .
W Visual Studio możesz skompilować plik (lub projekt) za pomocą / P.
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.
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.
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.