我想定义一组事物,比如事件处理程序.这个数组的内容在编译时是完全已知的,但是在多个编译单元之间定义,分布在多个相当分离的库中,至少直到最终(静态)链接.我也希望保持这种方式 - 因此添加或删除编译单元也将自动管理事件处理程序,而无需修改事件处理程序的中央列表.
这是我想做的一个例子(但不起作用).
central.h:
typedef void (*callback_t)(void);
callback_t callbacks[];
Run Code Online (Sandbox Code Playgroud)
central.c:
#include "central.h"
void do_callbacks(void) {
int i;
for (i = 0; i < sizeof(callbacks) / sizeof(*callbacks); ++i)
callbacks[i]();
}
Run Code Online (Sandbox Code Playgroud)
foo.c的:
#include "central.h"
void callback_foo(void) { }
callback_t callbacks[] = {
&callback_foo
};
Run Code Online (Sandbox Code Playgroud)
bar.c:
#include "central.h"
void callback_bar(void) { }
callback_t callbacks[] = {
&callback_bar
};
Run Code Online (Sandbox Code Playgroud)
我想要发生的是获得一个callbacks
包含两个元素的数组:&callback_foo
和&callback_bar
.使用上面的代码,显然有两个问题:
callbacks
阵列定义了多次.sizeof(callbacks)
编译时不知道central.c
.在我看来,第一点可以通过链接器合并两个callbacks
符号而不是抛出错误(可能通过变量的某些属性)来解决,但我不确定是否有类似的东西.即使有,问题的大小也应该以某种方式解决.
我意识到这个问题的一个常见解决方案是只有一个"注册"回调的启动函数或构造函数.但是,我只能看到两种实现方法:
由于我在内存有限的微控制器平台(Arduino)上运行,因此这些方法都不适合我.鉴于数组的全部内容在编译时是已知的,我希望有一种让编译器也能看到它的方法.
我已经找到了这个和 …