extern "C" 成员静态回调函数

extern "C" for member static callback function

我想为用 Haskell (GHC) 编写的代码提供回调函数。它使用类似 GCC C 编译器的函数类型来实现 export/import 功能,并在运行时与我的代码进行互操作。

我必须提供一个回调函数,它实际上接受指向 class 的 this 指针并调用它的方法:

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

逻辑上f_callback是classC的一部分,所以我把它放到了相应的命名空间范围内。

但我担心我是否应该使用 extern "C" 语言规范(调用约定在这里很重要,而不是名称修改)?可以在普通命名空间中声明和定义 extern "C" 函数,对于在不同命名空间中使用相同名称定义的 extern "C" 函数有一些特殊规则,但是 there is 命名空间之间没有区别class 作用域和简单命名空间之一。

是否可以将 static extern "C" 函数定义到 class 范围内?

外部回调在设计上没有链接到特定的 class。

根据您的代码内部结构,将其设为静态 class 成员也许不错,但它歪曲了现实。

因此,我建议将其作为一个独立的 extern "C" 函数。这避免了误解并突出了假设(例如,self 被假定为 C,但实际上可能是其他东西)。如果f()是public,这一切就很干净了。如果它是私有的,你需要让你的回调成为朋友,这种紧密耦合将再次突出显示。

包装替代方案只会添加一个多余的中间人来获得相同的结果。