2010-10-10 7 views
9

Al depurar algunos códigos C con gdb encontré algo que no había visto ni escuchado antes. El compilador (gcc -O0) parece haber creado un nuevo tipo para pasar una matriz de vectores a una función ... ¡Creo! Echar un vistazo a la información de código y GDB a continuación:¿GCC crea typedefs para matrices pasadas a funciones?

/* The Vector type - nothing unusual */ 
typedef struct { 
    float x,y,z; 
} Vector; 

/* The function I was debugging. 
* The second parameter is what seems to have changed */ 
extern void gui_shader_draw(
    guiShader *shader, 
    Vector quad[ 4 ], // << This is the one! 
    Vector origin, 
    Vector rotation, 
    Vector scale, 
    bool focus, 
    int mode); 

puse un punto de interrupción dentro de la función gui_shader_draw y esto es lo que veo:

break shader.c:248 
Breakpoint 1 at 0x80013ac0: file src/gui/shader.c, line 248. 
(gdb) continue 
Continuing. 
// I have split the next line 
Breakpoint 1, gui_shader_draw (
    shader=0x80588ea8, 
    quad_t=0x80585fe8, // << What the? 
    origin=..., 
    rotation=..., 
    scale=..., 
    focus=false, 
    mode=3) at src/gui/shader.c:249 

// The values quad_t points to are all good 
(gdb) print quad_t[0] 
$10 = {x = -320, y = -240, z = 0} 
(gdb) print quad_t[1] 
$11 = {x = 320, y = -240, z = 0} 
(gdb) print quad_t[2] 
$12 = {x = 320, y = 240, z = 0} 
(gdb) print quad_t[3] 
$13 = {x = -320, y = 240, z = 0} 

De dónde quad_t viene? Ciertamente no es un typedef en ninguno de mis códigos. El encabezado del sistema sys/types.h tiene un alias quad_t (int largo) pero eso no parece en absoluto relacionado. ¿Que esta pasando? ¿Me he perdido algo obvio?

EDIT 1: Debo señalar que el código se compila y funciona bien. No hay conflictos con alguna otra variable o tipo llamado quad_t. Simplemente tengo curiosidad sobre lo que ha hecho GCC y por qué.

EDIT 2: Como he sugerido, eché un vistazo a la salida del preprocesador y todas las instancias de 'Vector quad [4]' han cambiado a 'Vector quad_t [4]', por lo que el nombre ha cambiado, no el tipo.

extern void gui_shader_draw(
    guiShader *shader, 
    Vector quad_t[ 4 ], 
    Vector origin, 
    Vector rotation, 
    Vector scale, 
    _Bool focus, 
    int mode 
); 

No hay typedefs llamados 'quad_t' en la salida del preprocesador sin embargo. Pero encontré esto en sys/types.h (que me perdí antes - D'oh)

/usr/include$ find . | xargs grep -s quad_t 
./sys/types.h:typedef __uint64_t  u_quad_t; 
./sys/types.h:typedef __int64_t  quad_t; 
./sys/types.h:typedef quad_t *  qaddr_t; 
./sys/types.h:# define quad   quad_t // << There you are! 
+0

¿Hay otro identificador cuádruple que pueda entrar en conflicto con el suyo? – ninjalj

+0

Sin conflictos: el código funciona bien. Era solo algo por lo que tenía curiosidad. –

+0

Tome un poke en los encabezados del sistema; Me podría imaginar encontrar que había '#define quad quad_t' al acecho en alguna parte. (Vamos a eso, revisa también tus propios encabezados). –

Respuesta

4

¿Qué ocurre en el código no tiene absolutamente nada que ver con ningún typedefs, ya que el cambio es en modo alguno relacionado con cualquier tipo en absoluto. Lo que ha cambiado es el nombre del parámetro de función, no su tipo, que es inmediatamente obvio a partir de la salida del depurador.

Desde que se ve que el cambio en la salida del preprocesador, la única explicación razonable es que en algún lugar en el código hay un

#define quad quad_t 

Así que hay que buscar #define s para quad, no para quad_t. Huelga decir que #define no estará presente en la salida del preprocesador. Debe realizar una búsqueda global en todos los archivos de encabezado incluidos (tanto directa como indirectamente).

Cuestiones relacionadas