小编Mat*_*man的帖子

在链接时合并全局数组/从多个编译单元填充全局数组

我想定义一组事物,比如事件处理程序.这个数组的内容在编译时是完全已知的,但是在多个编译单元之间定义,分布在多个相当分离的库中,至少直到最终(静态)链接.我也希望保持这种方式 - 因此添加或删除编译单元也将自动管理事件处理程序,而无需修改事件处理程序的中央列表.

这是我想做的一个例子(但不起作用).

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符号而不是抛出错误(可能通过变量的某些属性)来解决,但我不确定是否有类似的东西.即使有,问题的大小也应该以某种方式解决.

我意识到这个问题的一个常见解决方案是只有一个"注册"回调的启动函数或构造函数.但是,我只能看到两种实现方法:

  • 使用动态内存(realloc)作为回调数组.
  • 使用固定(大于通常需要的)大小的静态内存.

由于我在内存有限的微控制器平台(Arduino)上运行,因此这些方法都不适合我.鉴于数组的全部内容在编译时是已知的,我希望有一种让编译器也能看到它的方法.

我已经找到了这个和 …

c c++ embedded arduino compile-time

10
推荐指数
2
解决办法
868
查看次数

标签 统计

arduino ×1

c ×1

c++ ×1

compile-time ×1

embedded ×1