在C中创建静态模块接口

我正在尝试在我的C项目中创建一个模块化接口,它允许有选择地构建源文件,并且无需更改任何项目的核心组件即可添加和删除源文件.我已经在网上搜索了一个关于如何做到这一点的方法,却找不到任何东西.

我在这个阶段的猜测,将涉及每个模块的内容,它们有自己的源文件和头文件(module_1.c,module_1.h,module_2.c,module_2.h等).每个模块可能必须有一个包含指向所需函数的指针的结构,如:

struct module_def {
  char *name;
  void (*module_init) (void);
  void (*module_shutdown) (void);
};

我相信核心代码需要访问这些定义结构的数组.我只是不知道如何使用已启用的模块列表自动生成这样的数组(或任何类似的数组),而不需要使用一个混乱的脚本,该脚本在构建过程中创建包含所有结构列表的新源文件.

至少,这就是我认为这应该有效的方式.

最后,我正在寻找一种在C中创建模块化编码接口的方法,它允许在构建期间选择性地链接单独的模块(源文件或目标文件,无关紧要),并由主应用程序调用.这适用于嵌入式解决方案,因此动态加载,共享库等无法工作.

最佳答案 使用gcc,你可以使用类似的东西:

(例如在foo_module.c中)

struct module_def foo_module {
    ...
};

static void init_module(void) __attribute__ ((constructor));

static void init_module(void) {
    register_my_module(&foo_module);
}

您可以将它放在每个模块文件中,并且应该在初始化时调用init_module函数(即在主代码启动之前清除bss等时).

请注意,这不是可移植的,但可以很好地与许多嵌入式平台配合使用,例如:与avr-gcc等.

点赞