成员静态回调函数的外部"C"
extern "C" for member static callback function
我想为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_callback
是C
类的一部分,因此我将其放入相应的名称空间范围。
但是我担心我是否应该使用extern "C"
语言规范(在这里调用惯例很重要,而不是命名杂物)?可以在平原名称空间中声明和定义extern "C"
函数,在不同命名空间中使用相同名称定义的extern "C"
函数有几个特殊规则,但是类别范围和简单命名空间的名称空间之间没有区别。
是否可以将static extern "C"
函数定义为类范围?
外部回调是由设计未链接到特定类的设计。
根据您的代码内部内容,使其成为静态类成员也许很不错,但它歪曲了现实。
因此,我建议使其成为独立的外部" C"功能。这避免了误解和突出假设(例如,假定自我是C,但实际上可以是其他事情)。如果F()是公开的,那么所有这些都会非常干净。如果它是私人的,则需要使您的回调成为朋友,并且这种紧密的耦合将再次突出显示。
包装器的替代方案只会添加一个冗余的中间人即可达到相同的结果。
相关文章:
- 调用外部函数,无法指定类型 C++/MVS
- 加载由 MATLAB Coder 生成的带有函数的 DLL,该函数调用外部函数
- add_cuda_library输出:未解析的外部函数
- 外部函数在 main() 上调用时返回分段错误 11.(C++)
- 如何在Windows Media Foundation中获取相机外部函数?
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- antlr cpp target 的标头部分不允许使用具有默认参数的外部函数
- 将多维数组传递给外部"C"函数为 void *
- llvm 调用一个以 char * 作为参数的外部函数
- 将 std::vector<bool> 传递给外部函数
- 如何在类向量中存储/使用外部函数指针
- LLVM - 如何使嵌套函数看到外部函数的变量
- CUDA9.2及以上版本中模板默认参数存在无法解决的外部函数错误
- 宏导入外部函数
- 如何在LLVM Pass中将字符串传递给外部函数
- C++:是否可以区分外部"C"函数和普通函数?
- 从外部函数访问外部结构属性
- 如何将成员声明为指向外部"C"函数的指针?
- C 将外部函数链接为成员函数
- LLVM JIT编译的程序找不到外部函数