2009-07-05 12 views
15

Ich versuche Amaya zu bauen. Wenn der Build mitDebugging des C++ Präprozessors

fehlgeschlagen

error: expected unqualified-id before ‘(’ token

lief ich g ++ nur mit dem Prä-Prozessor auf die Datei (die Option -c mit -E ersetzen), die zu kompilieren versäumt zu sehen, was los war. Dies ergab eine 80.000-Zeilen-Datei, die mir zeigte, dass "Blau" durch (2 8) ersetzt wurde, was den Fehler klar erklärte. Wenn ich das korrigiere, kompiliert die Datei gut. Ich könnte damit leben, aber ich würde gerne herausfinden, warum das passiert.

Kann ich irgendwie verfolgen, wie der Präprozessor eine bestimmte Zeichenfolge ersetzt, in diesem Fall 'Blau'?

================= aktualisieren ===================

Nun, ich fand die Täter:

> 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) 

So fügte #undef Blue das Problem behoben. Die Verwendung dieser Kombination aus -M und grep scheint also OK zu sein, aber manchmal können C++ - Präprozessordefinitionen eine echte Gesamtstruktur sein. Ich war neugierig, ob es vielleicht einen besseren Weg gäbe, ein cleveres GNU-Tool.

+0

Welche Plattform? – laalto

+0

i686 GNU/Linux. – Alex

Antwort

3

Wenn niemand etwas Besseres findet (basierend auf der Quellzeileninformation in der vorverarbeiteten Datei), könnten Sie die Option -M verwenden, um eine Liste der Header der Quelldatei zu erhalten und diese nach "Blau" zu durchsuchen. . Ich denke, es ist möglich, dass irgendeine Art von Verschleierung bedeutet, dass dies nicht das findet, wonach Sie suchen, aber normalerweise werden Sie die Definition irgendwo aufdecken.

+0

Dies sollte durch -E- –

1

Was mit dem ewigen

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

die in der Regel für mich funktioniert, zumindest als ersten Schnitt falsch ist.

+0

abgedeckt werden Ein anderer Ort zu grep ist System-Header wie/usr/include. – laalto

+1

In diesem Fall befand sich #define an einem Systemstandort, nicht in einer Datei unter dem Quellverzeichnis. – Alex

10

finde ich

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

läuft in Entwirren Vorverarbeitung Probleme als sehr nützlich. Von man g++:

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

Scheint, dass weder -dD noch -E etwas ausgeben, wenn während der Vorverarbeitung ein Syntaxfehler entdeckt wird, was in einigen Fällen etwas unbequem ist . –