我想为用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"
函数定义到类范围内?
答案 0 :(得分:5)
外部回调设计并未链接到特定类。
根据你的代码内部,使它成为一个静态类成员也许很好,但它歪曲了现实。
因此,我建议让它成为一个独立的外部人员&#34; C&#34;功能。这避免了误解和突出假设(例如,假设自我是C,但实际上可能是其他东西)。如果f()是公开的,那么这一切都会非常干净。如果它是私有的,你需要让你的回调成为朋友,这种紧密耦合将再次突出显示。包装器替代方案只是添加一个冗余的中间人来得到相同的结果。