Создает ли GCC определения типов для массивов, передаваемых функциям?

Отлаживая некоторый код 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
 );

Однако в выходных данных препроцессора нет определений типов с именем' 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!
9
задан x-x 10 October 2010 в 21:30
поделиться