2009-07-05 45 views
15

Estoy intentando construir Amaya. Cuando la compilación falló conDepuración del preprocesador C++

error: expected unqualified-id before ‘(’ token

me encontré con g ++ con sólo el preprocesador (en sustitución de la opción -c con -E) en el archivo que no pudo compilar para ver lo que estaba pasando. Esto produjo un archivo de 80,000 líneas, mostrándome que 'Azul' había sido reemplazado por (2 < < 8), lo que explicaba claramente el error. Si corrijo esto, el archivo compila bien. Creo que podría vivir con eso, pero me gustaría descubrir por qué sucede esto.

¿Hay alguna manera de que pueda rastrear cómo el preprocesador está reemplazando una cadena específica, en este caso 'Azul'?

actualización ================= ===================

Bueno, he encontrado el culpable:

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

Entonces, agregar #undef Blue solucionó el problema. Entonces, usar esta combinación de -M y grep parece correcto, pero a veces las definiciones del preprocesador de C++ pueden ser un bosque real; Tenía curiosidad de saber si había alguna forma mejor, alguna herramienta ingeniosa de GNU tal vez.

+0

¿Qué plataforma? – laalto

+0

i686 GNU/Linux. – Alex

Respuesta

3

Si a nadie se le ocurre algo mejor (basado en la información de la línea de origen en el archivo preprocesado), puede usar la opción -M para obtener una lista de encabezados incluidos en el archivo fuente y buscar "Azul" . Supongo que es posible que algún tipo de ofuscación signifique que esto no encuentra lo que estás buscando, pero normalmente aparecerás la definición en alguna parte.

+0

Esto debe estar cubierto por -E –

1

¿Qué pasa con el perenne

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

Que por lo general funciona para mí, al menos como un primer corte.

+0

Otro lugar para grep son los encabezados del sistema como/usr/include. – laalto

+1

En este caso, #define estaba en una ubicación de sistema, no en un archivo bajo el directorio de origen – Alex

10

me parece correr

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

a ser muy útil para desenredar los problemas de procesamiento previo. De man g++:

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

Parece que ni -dD ni -E producen nada si se detecta un error de sintaxis durante el preprocesamiento, lo que es un poco inconveniente en algunos casos . –

Cuestiones relacionadas