用于在C中调用模块的初始化代码的自动编译时机制

时间:2014-01-24 08:10:35

标签: c module initialization

我们正在模块化嵌入式设备的代码,试图从$%#!$ spaghetti代码中获取我们实际可以维护的代码。这个设备有几个版本,它们的外围设备数量大不相同,有些有SD卡,有些有以太网等等。这些外围设备需要初始化代码 我正在寻找的只是通过将.h / .c文件放入项目(或不是)来执行每个组件的特定初始化代码的方法。现在,在C ++中,我很想将一个全局对象放入每个组件中,这些组件在初始化期间注册必要的函数/方法。有没有类似普通C代码的东西,最好是一些预处理器/编译时魔术? 它应该看起来像这样

的main.c

int main(void) {
  initAllComponents();
}

sdio.c

MAGIC_REGISTER_COMPONENT(sdio_init)
STATUS_T sdio_init() {
   ...
}

ethernet.c

MAGIC_REGISTER_COMPONENT(ethernet_init)
STATUS_T ethernet_init() {
   ...
}

只需将sdio.c / ethernet.c(和/或.h)放入项目initAllComponents()即可调用相应的* _init()函数。

TIA

1 个答案:

答案 0 :(得分:1)

普通C中没有任何内容可以做到这一点。但是你可以做编译器扩展和链接器魔术。

GCC(以及其他一些试图兼容的版本)有__attribute__((constructor))可以在函数上使用。这需要运行时支持(libc或ld.so或等效的)。

对于链接器魔术(我个人更喜欢,因为它可以让你更好地控制实际发生的事情),请查看this question and my answer。我有一个功能实现on github。这也需要gcc和一个为我们创建正确符号的链接器,但不需要运行时的任何支持。