2010-02-12 12 views
12

¿Hay algún #define estandarizado (por ejemplo, implementado por todos los compiladores) que me permita distinguir entre compilaciones de depuración y lanzamiento?C/C++: ¿forma portátil de detectar errores/versiones?

+1

En realidad, el proyecto principal en el que trabajo, seguimos depurando en nuestro lanzamiento, pero que determine la verbosidad en el tiempo de ejecución. Ha demostrado ser útil en la búsqueda de errores en la naturaleza, con un costo mínimo (muy difícil de notar, sin quejas del usuario) cuando no está habilitado. Fuera de los entornos integrados, consideraría este enfoque. – mctylr

+0

¿Qué es una "versión de lanzamiento"? El estándar de C++ no lo define, por lo que no hay una forma portátil de detectar si algo es una versión de lanzamiento. – jalf

Respuesta

13

si creen

#ifdef NDEBUG 
    // nondebug 
#else 
    // debug code 
#endif 

es el más portátil.

Pero no El compilador sabe si está compilando depurar o liberar, por lo que esto no es automático. Pero este es utilizado por assert.h en el c-runtime, por lo que es bastante común. Visual Studio lo configurará, y estoy seguro de que la mayoría de los otros IDE también lo harán.

+0

la falta de un _ en el frente indica que probablemente se menciona en los estándares C o C++ en alguna parte. MS ha sido muy cuidadoso en los últimos lanzamientos para prefijar cualquier macro o función no estándar en sus archivos de cabecera de c-runtime con '_ –

+5

Eso no es lo mismo. La definición de NDEBUG desactiva las macros assert. Nada más. Esto hace __NOT__ implica depuración. –

+3

@Martin: nondebug en realidad. y si solo se pretendía apagar las macros assert, lo habrían llamado NOASSERT. deberías leer lo que escribí antes de comenzar a sacar puntos. –

0

Edit: ¡He leído mal la pregunta y me he salido en una tangente diferente! Disculpas ... La macro _NDEBUG se usa tanto en Linux como en Windows ...

Si se genera el binario y debe determinar si la compilación fue de lanzamiento/depuración, puede obtener un volcado hexadecimal, si verá muchos símbolos en él que serían información de depuración ... por ejemplo, bajo Linux, usando la utilidad strings. Hay una versión disponible para Windows por SysInternals, disponible aquí en technet. versiones de lanzamiento de ejecutables binarios no tendrían las cadenas que representan diferentes símbolos ...

 
strings some_binary 

Espero que esto ayude, Saludos, Tom.

+0

No necesariamente cierto; es posible producir binarios con símbolos (es decir, para funciones y datos estáticos) pero no depurar información (es decir, números de línea). –

+0

Dicho esto, las banderas que proporcionan esa información generalmente se almacenan en el encabezado del formato de archivo de objeto. Prueba GNU objdump (también hay una versión para Windows, distribuida con MinGW): objdump -x –

3

Como no hay una definición estándar de depuración o liberación, no hay una forma de hacerlo. Puedo pensar en al menos cuatro cosas diferentes que podrían significar, y todas pueden cambiarse de forma independiente. Solo dos pueden ser probados desde dentro del código.

  1. nivel de optimización del compilador
  2. símbolos de depuración incluidas en binario (que incluso pueden ser eliminados en una fecha posterior)
  3. assert() habilitada (NDEBUG no definida)
  4. registro de apagado