成员静态回调函数的外部"C"

extern "C" for member static callback function

本文关键字:外部 函数 静态 回调 成员      更新时间:2023-10-16

我想为Haskell(GHC)编写的代码提供回调功能。它使用GCC C-Compiler样函数类型来导出/导入功能并在运行时与我的代码进行互操作。

我必须提供一个回调函数,实际上,该功能实际上接受this指针,然后调用其方法:

struct C
{
    int f(int i) { ; }
    static int f_callback(void * self, int i)
    {
        static_cast< C * >(self)->f(i);
    }
};

逻辑上f_callbackC类的一部分,因此我将其放入相应的名称空间范围。

但是我担心我是否应该使用extern "C"语言规范(在这里调用惯例很重要,而不是命名杂物)?可以在平原名称空间中声明和定义extern "C"函数,在不同命名空间中使用相同名称定义的extern "C"函数有几个特殊规则,但是类别范围和简单命名空间的名称空间之间没有区别。

是否可以将static extern "C"函数定义为类范围?

外部回调是由设计未链接到特定类的设计。

根据您的代码内部内容,使其成为静态类成员也许很不错,但它歪曲了现实。

因此,我建议使其成为独立的外部" C"功能。这避免了误解和突出假设(例如,假定自我是C,但实际上可以是其他事情)。如果F()是公开的,那么所有这些都会非常干净。如果它是私人的,则需要使您的回调成为朋友,并且这种紧密的耦合将再次突出显示。

包装器的替代方案只会添加一个冗余的中间人即可达到相同的结果。