我有以下代码:
.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
在运行时,name为NULL,所有函数指针也是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之前添加extern关键字audio_subsystem解决了我的问题 问题,我认为这是默认大声笑。谢谢所有帮助过的人, 爱你们!
答案 0 :(得分:4)
标题文件中的这一行:
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文件也应该包含自己的标题以捕捉这些错误。)