c – 用于成员静态回调函数的extern“C”

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

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

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类范围的命名空间和简单命名空间之间没有区别一.

是否可以将静态extern“C”函数定义到类范围中?

解决方法

外部回调设计不与特定类相关联.

根据你的代码内部,使它成为一个静态类成员也许很好,但它歪曲了现实.

因此,我建议将其作为一个独立的外部“C”功能.这避免了误解和突出假设(例如,假设自我是C,但实际上可能是其他东西).如果f()是公共的,那么这一切都会非常干净.如果它是私有的,你需要让你的回调成为朋友,这种紧密耦合将再次突出显示.

包装器的替代方案只是添加一个冗余的中间人来得到相同的结果.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...