¿GCC define algo cuando se especifica-g?
debugging c-preprocessor (3)
En breve, quiero saber si gcc (o g ++. Lo necesito en C , pero también tengo curiosidad acerca de c ++) define cualquier símbolo especial si -g
está habilitado. ¿Lo hace? Si es así, ¿qué símbolos?
En el proceso de búsqueda descubrí que:
-
_DEBUG
se define manualmente (de forma manual me refiero a-D_DEBUG
) y es un hábito tomado de los programadores de Visual C (porque VC define_DEBUG
al compilar en modo de depuración) -
NDEBUG
se define si NO está en modo de depuración. Aunque encontré algunos lugares que dicen esto, probé con mi gcc y g ++ en archivos .c y .cpp y en ninguno de ellos con o sin-g
no se definió ese símbolo!
Editar : Permítanme demostrar por qué no quiero usar un símbolo no estándar:
Imagine un módulo kernel que hace algo y también proporciona archivos de encabezado para ser incluidos en otros módulos kernel para que se puedan conectar a este.
Ahora como una instalación, en uno de los archivos de encabezado que tengo:
#ifdef DEBUG <-- This is what I need
#define LOG(x, ...) printk("Some extra info"x, ##__VA_ARGS__);
#else
#define LOG(x, ...) printk("Without extra info"x, ##__VA_ARGS__);
#endif
Tenga en cuenta que el nombre no es realmente LOG
, eso es un ejemplo.
Ahora, puedo usar cualquier símbolo para DEBUG
, pero si alguien incluye mi encabezado, no pueden definir ese símbolo. Por supuesto, puedo decirles "por cierto, para obtener los encabezados en modo de depuración, definir este otro símbolo", pero eso no me suena bien.
Podría definir el símbolo en un encabezado e incluirlo en todos los archivos de encabezado. De esta forma, si incluyen uno de mis encabezados, también obtienen el símbolo de depuración. El problema ahora es que, si no desean compilar en modo de depuración, mis encabezados aún piensan que están en modo de depuración.
Entonces, lo que pensé que sería lo mejor era usar un símbolo que se define cuando se usa -g
, si hay alguno.
Actualizar
Hasta ahora llegué a la conclusión de que podía hacer algo como esto:
how_to_build.h
#if !defined(NDEBUG)
#define MY_DEBUG
#endif
Uso:
#include "how_to_build.h"
#ifdef MY_DEBUG
// rest of the story
De esta manera, la opción común de NDEBUG
elimina mi definición también. Todavía necesito que les diga que lo definan si no quieren obtener los encabezados en modo de depuración.
Como han dicho otros, y como se desprende del manual , GCC no proporciona ninguna macro intrínseca que indique si se generará información de depuración (modo -g
). Lo que quiero agregar es que esto es a propósito.
Hace mucho, mucho tiempo, los autores originales de GCC (RMS, Kenner, probablemente otros dos) decidieron que habilitar la información de depuración no debería ocasionar ningún cambio en el código real, para reducir el riesgo de que un error desaparezca misteriosamente cuando intenta depurar eso Este es un principio de diseño fundamental en GCC, e incluso hoy los desarrolladores hacen todo lo posible por mantenerlo.
Definir una macro violaría este principio de diseño, ya que permitiría que el código fuente se cambie a sí mismo en respuesta a -g
.
Corriendo
g++ -E -dD -xc++ /dev/null
vs.
g++ -E -dD -g -xc++ /dev/null
no me muestra símbolos adicionales definidos
Eso, combinado con la falta de documentación que establezca que los símbolos se definan, debería ser suficiente para decir con seguridad que no se define nada.
Puede ver la lista de todas las macros que gcc / g ++ define para cualquier combinación de banderas como esa:
$ g++ -E -dD -xc++ /dev/null
Por ejemplo:
[max@truth ~]$ g++ -E -dD -xc++ /dev/null > a
[max@truth ~]$ g++ -E -dD -xc++ -g -O3 /dev/null > b
[max@truth ~]$ diff a b
1a2
> # 1 "/home/max//"
173c174
< #define __NO_INLINE__ 1
---
> #define __OPTIMIZE__ 1
Veamos si -g
define algo:
[max@truth ~]$ g++ -E -dD -xc++ -g /dev/null > c
[max@truth ~]$ diff a c
1a2
> # 1 "/home/max//"
Directiva de preprocesador adicional, pero no se define adicional para la bandera -g
.