gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:56:32 25 4
gpt4 key购买 nike

在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com