Czy istnieje sposób, aby gcc / g ++ zrzucił definicje preprocesora z wiersza poleceń? Mam na myśli takie rzeczy __GNUC__
, __STDC__
i tak dalej.
gcc
g++
c-preprocessor
Anycorn
źródło
źródło
echo | gcc -dM -E -
działa również w systemie Windows.cpp -dM -E - < NUL
można użyć.Zwykle robię to w ten sposób:
Zauważ, że niektóre definicje preprocesora zależą od opcji wiersza poleceń - możesz je przetestować, dodając odpowiednie opcje do powyższego wiersza poleceń. Na przykład, aby zobaczyć, które opcje SSE3 / SSE4 są domyślnie włączone:
a następnie porównaj to, gdy
-msse4
określono:Podobnie możesz zobaczyć, które opcje różnią się między dwoma różnymi zestawami opcji wiersza poleceń, np. Porównaj definicje preprocesora dla poziomów optymalizacji
-O0
(brak) i-O3
(pełny):źródło
Późna odpowiedź - uznałem inne odpowiedzi za przydatne - i chciałem dodać trochę więcej.
Jak zrzucić makra preprocesora pochodzące z określonego pliku nagłówka?
lub (dzięki @mymedia za sugestię):
W szczególności chciałem zobaczyć, co SOMAXCONN został zdefiniowany w moim systemie. Wiem, że mogłem po prostu otworzyć standardowy plik nagłówka, ale czasami muszę się trochę rozejrzeć, aby znaleźć lokalizację pliku nagłówka. Zamiast tego mogę po prostu użyć tej linijki:
źródło
Proste podejście (
gcc -dM -E - < /dev/null
) działa dobrze w przypadku gcc, ale nie działa w przypadku g ++. Ostatnio wymagałem testu funkcji C ++ 11 / C ++ 14. Zalecenia dotyczące odpowiadających im nazw makr są publikowane na stronie https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations . Ale:zawsze kończy się niepowodzeniem, ponieważ po cichu wywołuje sterowniki C (tak jakby były wywoływane przez
gcc
). Można to zobaczyć, porównując dane wyjściowe z gcc lub dodając opcję wiersza polecenia specyficzną dla g ++, taką jak (-std = c ++ 11), która emituje komunikat o błędziecc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C
.Ponieważ gcc (inne niż C ++) nigdy nie będzie obsługiwał „Aliasów szablonów” (patrz http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf ), musisz dodać
-x c++
opcję do-x c++
wymuś wywołanie kompilatora C ++ (Kredyty za korzystanie z opcji zamiast pustego pliku zastępczego przejdź do yuyichao, patrz poniżej):Nie będzie danych wyjściowych, ponieważ g ++ (wersja 4.9.1, domyślnie -std = gnu ++ 98) domyślnie nie włącza funkcji C ++ 11. Aby to zrobić, użyj
co ostatecznie ustępuje
zauważając, że g ++ 4.9.1 obsługuje po wywołaniu „Alias szablonów”
-std=c++11
.źródło
-x
argument, więcg++ -x c++ -dM -E -std=c++11 - < /dev/null | grep cpp
powinno działać.Przenośne podejście, które działa równie dobrze w systemie Linux lub Windows (gdzie nie ma / dev / null):
W przypadku c ++ możesz użyć (zamień na
c++11
dowolną używaną wersję):Działa, mówiąc gcc, aby wstępnie przetworzył standardowe wejście (które jest wytwarzane przez echo) i wypisał wszystkie definicje preprocesora (wyszukaj
-dletters
). Jeśli chcesz wiedzieć, jakie definicje są dodawane po dołączeniu pliku nagłówka, możesz użyć-dD
opcji podobnej do -dM, ale nie zawierającej predefiniowanych makr:Należy jednak pamiętać, że puste dane wejściowe nadal generują wiele definicji z
-dD
opcją.źródło
NUL
, wrócisz do punktu wyjścia: nie będzie działać na systemach, które go nie mają.sort
zachowuje się trochę inaczej):echo | gcc -x c++ -std=c++17 -dM -E - | sort
Podczas pracy w dużym projekcie, który ma złożony system kompilacji i gdzie trudno jest uzyskać (lub zmodyfikować) polecenie gcc / g ++ bezpośrednio, istnieje inny sposób, aby zobaczyć wynik ekspansji makr. Po prostu przedefiniuj makro, a otrzymasz wynik podobny do następującego:
źródło