Beim Debuggen von C-Code mit gdb bin ich auf etwas gestoßen, das ich noch nie gesehen oder gehört habe! Der Compiler (gcc -O0) scheint einen neuen Typ für die Übergabe eines Arrays von Vektoren an eine Funktion erstellt zu haben ... Ich denke! Werfen Sie einen Blick auf den Code und GDB Informationen unter:Erstellt GCC typedefs für Arrays, die an Funktionen übergeben werden?
/* 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);
ich einen Haltepunkt in der gui_shader_draw Funktion und das ist, was ich sehe:
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}
Wo haben quad_t gekommen? Es ist sicherlich kein Typdef in meinem Code. Der Systemkopf sys/types.h hat einen quad_t-Alias (long int), aber das scheint überhaupt nicht zu sein! Was ist los? Habe ich etwas Offensichtliches verpasst?
EDIT 1: Ich muss darauf hinweisen, dass der Code kompiliert und funktioniert gut. Es gibt keine Konflikte mit einer anderen Variablen oder einem Typ namens quad_t. Ich bin nur neugierig darauf, was GCC getan hat und warum.
EDIT 2: Wie vorgeschlagen, habe ich einen Blick auf die Präprozessorausgabe geworfen und tatsächlich wurden alle Instanzen von 'Vector quad [4]' in 'Vector quad_t [4]' geändert, also hat sich der Name geändert, nicht der Art.
In der Präprozessorausgabe gibt es keine typedefs, die 'quad_t' genannt wird. Aber ich tat dies in sys/types.h finden (was ich vor verpasst - 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!
Gibt es einen anderen Quad-Bezeichner, der zu Ihrem Konflikt führen würde? – ninjalj
Keine Konflikte - der Code funktioniert gut. Es war nur etwas, worüber ich neugierig war. –
Werfen Sie einen Stich auf die Systemheader; Ich könnte mir vorstellen, dass irgendwo "#define quad quad_t" lauert. (Kommen Sie dazu, überprüfen Sie auch Ihre eigenen Header.) –