我有以下代码:
.h文件:
typedef struct subsystem
{
const char* name;
SDL_bool (*fun_init)();
SDL_bool (*fun_updt)();
SDL_bool (*fun_quit)();
void (*fun_poll)(SDL_Event* event);
} subsystem_t;
subsystem_t audio_subsystem;
.c文件:
SDL_bool audio_init()
{
SDL_Log("Audio Init");
return SDL_TRUE;
}
SDL_bool audio_quit()
{
SDL_Log("Audio Quit");
return SDL_TRUE;
}
subsystem_t audio_subsystem = {"Audio", audio_init, NULL, audio_quit, NULL};
程序运行时,AUDIO_SUBSYSTEM具有以下数据(具有一些日志功能):
(null):: 00000000 :: 00000000 :: 00000000 :: 00000000
在运行时,名称为null,所有功能指针也为空,我不知道为什么会发生这种情况,C编译器正在用零填充我的结构。
这是日志函数:
SDL_Log("%s :: %p :: %p :: %p :: %p", subsystem->name, subsystem->fun_init, subsystem->fun_updt, subsystem->fun_quit, subsystem->fun_poll);
编辑:
在subsystem_t audio_subsystem解决我的我的 问题,我认为这是默认的大声笑。谢谢所有帮助的人 爱你们!
标题文件中的这一行:
subsystem_t audio_subsystem;
不仅是声明,它是文件范围时静态变量的定义,该变量将以零值初始化。此外,包括标头的每个编译单元都将定义其自己的audio_subsystem
。
显然,您的C文件不包括其标题,否则该行:
subsystem_t audio_subsystem = {"Audio", audio_init, NULL, audio_quit, NULL};
将被标记为相同符号的重新定义。
要解决错误,您可以将标题中的变量标记为使用extern
关键字的声明:
extern subsystem_t audio_subsystem;
这只是声明一个没有数据的变量。标题文件的用户知道有这样的变量,并且在C文件中定义了变量本身(使用适当的初始评估器)。
(但也许您可以找到一个更好的设计,不需要共享全局变量。这也是很好的做法,C文件应包括自己的标题以捕获此类错误。)