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!
¿Hay otro identificador cuádruple que pueda entrar en conflicto con el suyo? – ninjalj
Sin conflictos: el código funciona bien. Era solo algo por lo que tenía curiosidad. –
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). –