c++ - extern "C"用于成员静态回调函数

标签 c++ c callback language-lawyer extern

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

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

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

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

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

是否可以将 static extern "C" 函数定义到类作用域中?

最佳答案

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

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

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

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

关于c++ - extern "C"用于成员静态回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46336950/

相关文章:

c++ - 如何从函数中检测不返回语句

python - 当用C扩展Python时,如何用C动态构建复杂的结构?

C程序: regular versus ragged character-string arrays

c++ - C程序解决其中包含函数的表达式

c++ - 指向模板类的指针

c++ - 如何让 llvm 优化以下浮点方程

c++ - 如何强制 Mac 窗口到前台?

javascript - JWPlayer JavaScript 集成突然不起作用

clojure - 长期运行的递归 Clojure 函数的进度更新

JavaScript 多重回调函数