c - GCC 是否为传递给函数的数组创建 typedef?

标签 c gcc function compiler-construction parameter-passing

在使用 gdb 调试一些 C 代码时,我遇到了一些我以前从未见过或听说过的东西!编译器 (gcc -O0) 似乎创建了一种新类型,用于将 vector 数组传递给函数……我想!查看下面的代码和 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!

最佳答案

代码中发生的事情与任何 typedef 完全无关,因为更改与任何类型都没有任何关系。发生变化的是函数参数的名称,而不是它的类型,这从您的调试器输出中可以立即看出。

由于您在预处理器输出中看到了这种变化,唯一合理的解释是代码中某处有一个

#define quad quad_t

因此您必须为 quad 寻找 #define,而不是为 quad_t。不用说,#define 不会出现在预处理器输出中。您必须在所有包含的(直接和间接的)头文件中进行全局搜索。

关于c - GCC 是否为传递给函数的数组创建 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3899605/

相关文章:

c - Kernel Scheduler(Linux) - 任务是函数吗?

c - 为什么将变量 `i` 初始化为 0 和较大的大小会导致程序大小相同?

linux - 从可执行文件中转储 debug_loc 部分

c - makefile 相对路径是否与 gcc 相对路径相同?

c - 如何使用较新版本升级/更新 C 应用程序

c - 为什么变量的地址在传递函数后会改变

你能帮我做这个算法吗 "Shifting a String to right or left"

c - while 循环中的两个 scanf 语句无法正确读取

typescript - 类变量在函数内部未定义

php - 有人可以向我解释一下 PHP 中的 pack() 函数吗?