gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:39:04 25 4
gpt4 key购买 nike

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

主.c

int main(void) {
initAllComponents();
}

音频文件

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

以太网.c

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

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

TIA

最佳答案

普通 C 中没有任何东西可以做到这一点。但是,您可以使用编译器扩展和链接器魔法。

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

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

关于c - C中调用模块初始化代码的自动编译时机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21327533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com