我们正在模块化嵌入式设备的代码,试图从$%#!$ 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
答案 0 :(得分:1)
普通C中没有任何内容可以做到这一点。但是你可以做编译器扩展和链接器魔术。
GCC(以及其他一些试图兼容的版本)有__attribute__((constructor))
可以在函数上使用。这需要运行时支持(libc或ld.so或等效的)。
对于链接器魔术(我个人更喜欢,因为它可以让你更好地控制实际发生的事情),请查看this question and my answer。我有一个功能实现on github。这也需要gcc和一个为我们创建正确符号的链接器,但不需要运行时的任何支持。