2009-07-05 21 views
15

Próbuję zbudować Amayę. Kiedy budowa nie powiodło się zDebugowanie preprocesora C++

error: expected unqualified-id before ‘(’ token

Pobiegłem g ++ tylko preprocesora (zastąpienia opcji -c z -E) na pliku, który udało się skompilować, aby zobaczyć co się dzieje. Spowodowało to powstanie pliku o wartości 80 000 linii, pokazując, że "niebieski" został zastąpiony przez (2 < < 8), co jasno wyjaśniło błąd. Jeśli to poprawię, plik będzie kompilowany poprawnie. Sądzę, że mógłbym z tym żyć, ale chciałbym się dowiedzieć, dlaczego tak się dzieje.

Czy jest jakiś sposób mogę śledzić, jak preprocesor zastępuje określony ciąg, w tym przypadku "niebieski"?

================= Aktualizacja ===================

Cóż, znalazłem winowajca:

> headers=`g++ [omited for brevity] -M \ 
    ../../thotlib/dialogue/AmayaClassicNotebook.cpp` 

> for file in $headers ; do grep -s -H Blue $file | grep "(2 << 8)";done 

/usr/local/include/gc.h:#define Blue (2 << 8) 

Dodanie #undef Blue rozwiązało problem. Zatem używanie kombinacji -M i grep wydaje się być w porządku, ale czasami definicje preprocesora C++ mogą być prawdziwym lasem; Byłem ciekawy, czy jest jakiś lepszy sposób, może jakieś sprytne narzędzie GNU.

+0

Która platforma? – laalto

+0

i686 GNU/Linux. – Alex

Odpowiedz

3

Jeśli nikt nie wymyśli nic lepszego (na podstawie informacji o linii źródłowej w wstępnie przetworzonym pliku), można użyć opcji -M, aby uzyskać listę nagłówków zawartych w pliku źródłowym i wyszukać w nich hasło "Niebieski" . Oczekuję, że jest możliwe, że jakiś rodzaj zaciemnienia oznacza, że ​​nie znajdzie to, czego szukasz, ale zazwyczaj podasz definicję gdzieś.

+0

To powinno być pokryte przez -E –

1

Co jest nie tak z całorocznym

find /src -exec grep Blue {} /dev/null ';' 

który zazwyczaj pracuje dla mnie, przynajmniej jako pierwszego cięcia.

+0

Innym miejscem do grep są nagłówki systemowe, takie jak/usr/include. – laalto

+1

W tym przypadku #define znajdował się w położeniu systemowym, a nie w pliku pod katalogiem źródłowym. – Alex

10

znajdę działa

g++ ... -dD -E $file > $file.ii 

być bardzo przydatna w untangling problemy przetwarzaniu wstępnym. Od man g++:

-dD Dump all macro definitions, at the end of preprocessing, 
    in addition to normal output. 
+0

Wygląda na to, że ani -dD, ani -E niczego nie wypisują, jeśli wykryty zostanie błąd składniowy podczas wstępnego przetwarzania, co w niektórych przypadkach jest niedogodne. . –

Powiązane problemy