2010-10-10 14 views
9

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! 
+0

Gibt es einen anderen Quad-Bezeichner, der zu Ihrem Konflikt führen würde? – ninjalj

+0

Keine Konflikte - der Code funktioniert gut. Es war nur etwas, worüber ich neugierig war. –

+0

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.) –

Antwort

4

Was im Code passiert, hat absolut nichts mit irgendwelchen typedefs zu tun, da die Änderung in keiner Weise bezogen auf alle Arten überhaupt. Was hat sich geändert, ist der Name des Funktionsparameters nicht sein Typ, der sofort aus Ihrer Debugger-Ausgabe ersichtlich ist.

Da Sie diese Änderung in der Präprozessorausgabe sehen, die einzige vernünftige Erklärung ist, dass irgendwo im Code ein ist

#define quad quad_t 

So müssen Sie für quad für #define s aussehen, nicht für quad_t. Es ist unnötig zu sagen, dass #define nicht in der Präprozessorausgabe vorhanden ist. Sie müssen eine globale Suche in allen enthaltenen (sowohl direkt als auch indirekt) Header-Dateien durchführen.

Verwandte Themen