我已经决定构建一个模块化程序但是我在C中实现了这个失败。这是我的程序不会链接。我相信我失败了构建我的文件之间的依赖关系。这样做的“正确”方式如何?
这有点鸡/蛋的问题。我需要定义struct module并且main.c需要能够访问module_event并且event.c需要能够访问module_main。
使用这个示例代码,由于多个定义,我得到一个链接器错误,我可以避免使用“内联”,但这不是我想做的事情。
#include "main.h"
void event_cmd(void);
module module_event = {.cmd = &event_cmd};
#include "event.h"
#include "main.h"
void event_cmd(void)
{
/* */
}
typedef struct {
void (* cmd)(void)
} module;
void main_cmd(void);
module module_main = {.cmd = &main_cmd};
include "main.h"
include "event.h"
void main_cmd(void)
{
/* */
}
答案 0 :(得分:2)
问题是module_event
在全球范围内event.c
和main.c
都已定义。这会导致链接问题,因为符号定义了两次,链接器不知道它需要链接到哪个符号。要解决 -
在event.h中
extern module module_event;
在event.c中
module module_event = {.cmd = &event_cmd};
这里重要的是定义可以在event.c
或main.c
中提供,但不能在两者中提供。