Podczas debugowania kodu C za pomocą gdb natknąłem się na coś, czego wcześniej nie widziałem ani nie słyszałem! Wydaje się, że kompilator (gcc -O0) stworzył nowy typ do przekazywania tablicy wektorów do funkcji ... Myślę! Spojrzeć na informacje i gdb kodu poniżej:Czy GCC tworzy typedefs dla tablic przekazywanych do funkcji?
/* 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);
ustawić punkt przerwania wewnątrz funkcji gui_shader_draw i to co widzę:
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}
Skąd quad_t pochodzi? Z pewnością nie jest to typedef w żadnym z moich kodów. Nagłówek systemowy sys/types.h ma alias quad_t (long int), ale nie wydaje się to wcale powiązane! Co się dzieje? Czy przegapiłem coś oczywistego?
EDYCJA 1: Muszę zaznaczyć, że kod kompiluje się i działa prawidłowo. Nie ma żadnych konfliktów z inną zmienną lub typem o nazwie quad_t. Jestem tylko ciekawy, co GCC zrobił i dlaczego.
EDYCJA 2: Zgodnie z sugestią, przejrzałem dane wyjściowe preprocesora, a wszystkie wystąpienia "Wektor quada [4]" zostały zmienione na "Wektor czwarty [4]", więc nazwa zmieniła się, a nie rodzaj.
extern void gui_shader_draw(
guiShader *shader,
Vector quad_t[ 4 ],
Vector origin,
Vector rotation,
Vector scale,
_Bool focus,
int mode
);
Nie ma typedefs o nazwie "quad_t" na wyjściu preprocesora. Ale znalazłem to w sys/types.h (co brakowało mi wcześniej - 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!
Czy istnieje kolejny identyfikator kwadratu, który byłby niezgodny z twoim? – ninjalj
Brak konfliktów - kod działa poprawnie. To było coś, co mnie interesowało. –
Zrób poke na nagłówkach systemu; Mogłem sobie wyobrazić, że gdzieś jest '#define quad quad_t'. (Przyjdź do tego, sprawdź również swoje własne nagłówki.) –