【问题标题】:Are there any pitfalls when passing function pointers between compilation units?在编译单元之间传递函数指针时是否有任何陷阱?
【发布时间】:2014-11-26 17:11:57
【问题描述】:
我问是因为我使用 PIC 微控制器来异步操作硬件并将函数指针作为回调机制实现会很有好处。
一个例子是 i2C 库接受读取和写入“作业”,并在硬件资源可用时(以及用户勾选 i2C 软件状态机)顺序执行每个“作业”。根据实施者对 i2C 库的使用,他们可能希望在返回数据之前对其进行操作(位掩码、设置标志等),这就是我正在考虑添加 i2C 回调机制的地方。
用户将传递一个作业,其中包括一个指向调用编译单元的回调函数。这是允许的吗?如果允许的话,有什么需要注意的情况吗?
【问题讨论】:
标签:
c
callback
function-pointers
【解决方案1】:
在编译单元之间传递指针一直都在进行。例如,标准库中的free() 肯定是单独编译的,但它的参数是指针。
在包括 Linux 内核在内的许多项目中,经常使用编译单元之间的回调。
主要是使用通用头文件来定义共享变量,进行函数定义等。如果您使用 long 指针定义函数,但使用指定 char 指针的声明调用它,则您将进入未定义行为领域。
还要注意可能会改变变量大小、默认打包等的编译器标志。