2011-03-07 21 views
24

He estado usando algo como esto:C++ determinar si compilar con símbolos de depuración sin definir un símbolo de preprocesador

int main(int argc, char *argv[]) 
{ 

#ifdef DEBUG 
    printf("RUNNING DEBUG BUILD"); 
#else 
    printf("Running... this is a release build."); 
#endif 
... 

Sin embargo, esto me obliga a compilar con -DDEBUG para la versión de depuración. ¿GCC me da alguna forma de determinar cuándo estoy compilando con símbolos de depuración (indicador -g) como definir su propia macro preprocesador que puedo verificar?

+2

No lo sé con certeza, pero lo dudo mucho. En teoría, el preprocesamiento podría hacerse en un pase separado con el comando 'cpp' antes de la compilación, y el preprocesador no tiene noción de símbolos de depuración o la opción' -g'. –

Respuesta

21

La respuesta es no. Usualmente estas macros (DEBUG, NDEBUG, _DEBUG) son establecidas por el sistema IDE/make dependiendo de la configuración (depuración/liberación) que tenga activa. Creo que estas respuestas pueden ser de ayuda:

C#define macro for debug printing

Where does the -DNDEBUG normally come from?

_DEBUG vs NDEBUG

+0

Busqué en NetBeans - parece que este IDE al menos no le proporciona ningún indicador de depuración específico, así que terminé haciendo una definición manual, es decir, -DDEBUG en la línea de comando de g ++ (en opciones de proyecto) – Pete855217

0

Creo que la respuesta que estaba buscando era esencialmente lo que Adam registró como un comentario, que es:

El trabajo del compilador no incluye el preprocesamiento, y de hecho el compilador se ahogará en cualquier conmutador de preprocesador no manejado por el preprocesador que se abre camino en el código.

Por lo tanto, debido a que la forma de código de sucursal tiene que aprovechar el preprocesador, significa que en el momento en que el compilador consigue cualquier código que ya es uno o el otro (código de depuración o la liberación de código), por lo que es imposible para mí hacer lo que mi pregunta me pide en esta etapa (después del preprocesador).

Por lo tanto, es una consecuencia directa de que el preprocesador se diseñe como un proceso separado para alimentar el código.

+0

Tiene que tener un diferente conjunto de opciones para el compilador de todos modos, ¿por qué no asegurarse de que el símbolo 'NDEBUG' también se define apropiadamente? –

+0

Bueno, sí. Por qué no. Así es como se enseña, así es como se debe usar, y este es el razonamiento por el cual es así. (conceptual e idealmente, solo debería haber una bandera que lo controle, pero en la práctica debemos usar tanto '-g' como' -DDEBUG') –

+0

No olvide que tener símbolos no significa que sea una 'depuración' o construcción no optimizada. Cualquier tipo de construcción puede tener símbolos generados. –

Cuestiones relacionadas