【发布时间】:2020-06-09 04:03:40
【问题描述】:
我有一个用于嵌入式系统的 C 模块(foo.c,foo.h),它包含一个函数 my_driver_fn(),从 API 的角度来看,它在范围内是本地的(例如,不在 foo 的公共标头中:任何其他通过#include "foo.h" 使用其 API 的代码不应被允许调用此函数)。假设 my_driver_fn() 是可重入的。
但是,foo 使用库 libdostuff 需要使用一些用户提供的回调函数(架构/硬件特定的东西)进行初始化,才能在任何平台上正常工作。在foo 中,上面提到的my_driver_fn 将是有问题的功能之一……libdostuff 需要,但任何使用foo 的人都不需要。
对于这些回调函数(my_driver_fn() 在@987654335 中声明为static @? 鉴于它的地址是提供给libdostuff 并且它是“间接”调用的(尽管从未直接调用)?
注意:我碰巧同时写了foo 和libdostuff,我想知道用户提供的函数是extern 并在链接时纯粹解决,还是通过通过初始化函数中提供的用户提供的回调表进入libdostuff(例如libdostuff_init(CallbackTable *user_callbacks),其中CallbackTable有一个函数指针,该指针将被初始化为指向my_driver_fn)
【问题讨论】:
-
@M.M 从封装的角度我同意。我只是想确保我根本没有妨碍编译器,或者调用未定义的行为(编译器假设它不能在模块外部调用,所以一些恶作剧也是如此)
-
@M.M 请提交答案,我可以给你点赞
-
你为什么要标记这个 C++ btw?这是另一个故事——你可以使用私有成员函数,而静态成员可能不是最好的主意。 C++ 总体上不适合嵌入式系统 - 太多的地雷会炸掉你的整条腿。
标签: c++ c linker embedded compiler-optimization