2010-10-10 11 views
9

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

Czy istnieje kolejny identyfikator kwadratu, który byłby niezgodny z twoim? – ninjalj

+0

Brak konfliktów - kod działa poprawnie. To było coś, co mnie interesowało. –

+0

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

Odpowiedz

4

Co się dzieje w kodzie nie ma absolutnie nic wspólnego z jakimikolwiek typedefs, ponieważ zmiana nie jest w żaden sposób związane z jakimkolwiek typem. To, co się zmieniło, to parametr funkcji, a nie jego typ, co jest natychmiast oczywiste na wyjściu debuggera.

Ponieważ widać, że zmiany na wyjściu preprocesora, jedynym rozsądnym wyjaśnieniem jest to, że gdzieś w kodzie istnieje

#define quad quad_t 

Więc trzeba szukać #define S quad, nie dla quad_t. Nie trzeba dodawać, że #define nie będzie obecny na wyjściu preprocesora. Musisz wykonać wyszukiwanie globalne we wszystkich dołączonych (zarówno bezpośrednio, jak i pośrednio) plikach nagłówkowych.

Powiązane problemy