GCC создает typedefs для массивов, переданных в функции? - PullRequest
9 голосов
/ 10 октября 2010

При отладке кода на C с помощью gdb я наткнулся на то, чего раньше не видел и не слышал!Компилятор (gcc -O0), похоже, создал новый тип для передачи массива векторов в функцию ... Я думаю!Посмотрите на код и информацию о GDB ниже:

/* 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 );

Я установил точку останова внутри функции gui_shader_draw, и вот что я вижу:

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}

Откуда взялся quad_t?Это, конечно, не typedef ни в одном из моих кодов.Системный заголовок sys / types.h имеет псевдоним quad_t (long int), но это никак не связано!В чем дело?Я что-то упустил очевидное?

РЕДАКТИРОВАТЬ 1: Я должен указать, что код компилируется и работает нормально.Нет столкновений с какой-либо другой переменной или типом с именем quad_t.Мне просто любопытно, что GCC сделал и почему.

РЕДАКТИРОВАТЬ 2: Как было предложено, я посмотрел на вывод препроцессора и действительно все экземпляры «Vector quad [4]» были изменены на «Vector»quad_t [4] ', поэтому изменилось имя, а не тип.

extern void gui_shader_draw(
    guiShader *shader,
    Vector quad_t[ 4 ],
    Vector origin,
    Vector rotation,
    Vector scale,
    _Bool focus,
    int mode
 );

Однако в выводе препроцессора нет typedef с именем' quad_t '.Но я нашел это в sys / types.h (который я пропустил раньше - черт!)

/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!

1 Ответ

4 голосов
/ 11 октября 2010

То, что происходит в вашем коде, не имеет абсолютно никакого отношения к каким-либо определениям типов, поскольку изменение никак не связано с какими-либо типами.Изменения - это имя параметра функции, а не его тип, что сразу видно из выходных данных отладчика.

Поскольку вы видите это изменение в выходных данных препроцессора, единственное разумное объяснение состоит в том,где-то в коде есть

#define quad quad_t

Так что вам нужно искать #define s для quad, а не для quad_t.Само собой разумеется, что #define не будет присутствовать в выходных данных препроцессора.Вы должны выполнить глобальный поиск по всем включенным (как прямо, так и косвенно) заголовочным файлам.

...