2008-09-19 19 views
13

En general, ocasionalmente tengo una cadena de macros anidadas con algunos elementos condicionales de preprocesador en sus definiciones. Puede ser doloroso depurar, ya que es difícil ver directamente el código real que se está ejecutando.¿Hay un buen método general para depurar macros de C++?

Hace un tiempo recuerdo vagamente encontrar un indicador de compilador (gcc) para expandirlos, pero tuve problemas para hacer que esto funcione en la práctica.

+0

retaged gcc, basado en contenido –

Respuesta

14

gcc -E enviará la fuente preprocesada a stdout.

1

Depure el cuadro de distribución con los símbolos cargados.

8

Para usuarios de MSVC, puede hacer clic con el botón derecho en el archivo/proyecto, ver la configuración y cambiar las propiedades del archivo para generar el origen preprocesado (que normalmente está en el directorio obj).

+0

Voto a favor para la punta, pero debo decir que el archivo por procesado es peor que ir a través de las macros usted mismo (especialmente si una macro abarca múltiples líneas). Decenas de miles de líneas de largo por algún motivo, con muchas líneas en blanco que llenan la mayor parte del documento. – Samaursa

5

Esto podría no ser aplicable en su caso, pero las macros dificultan la depuración y, a menudo, se usan en exceso y son evitables.

¿Se puede reemplazar con funciones en línea o deshacerse de todas juntas?

+1

Gracias; buen consejo. No estaba preguntando por una situación en particular sino porque tuve problemas en el pasado con esto y anticipo más en el futuro. Gran parte del código que mantengo (la mayoría no escrito por mí) utiliza macros extensamente, por lo que aún es útil poder depurarlos. – Tyler

+1

He votado a favor, pero desafortunadamente, muchos de nosotros necesitamos saber esta información porque nos quedan las macros de depuración utilizadas por personas que son perezosas, incompetentes o que creen que el uso frecuente y prolífico de las macros es un "buen diseño". – weberc2

2

Probablemente debería comenzar a alejarse de las macros y comenzar a usar en línea y plantillas.

Las macros son una herramienta antigua, la herramienta adecuada a veces. Como último recurso, recuerde que printf es su amigo (y en realidad printf no es un amigo tan malo cuando hace cosas multiproceso)

0

Los compiladores GCC y compatibles usan la opción -E para enviar la fuente preprocesada a la salida estándar.

gcc -E foo.cpp 

Sun Studio también es compatible con esta bandera:

CC -E foo.cpp 

Pero aún mejor es -xdumpmacros. Puede encontrar más información in Suns' docs.

1

gcc-temps -save va a escribir un .i (o archivo .ii para C++), que es la salida del preprocesador de C, antes de que sea entregado al compilador. Esto a menudo puede ser esclarecedor.

Cuestiones relacionadas