【问题标题】:C/C++ opaque pointer libraryC/C++ 不透明指针库
【发布时间】:2011-02-12 03:38:14
【问题描述】:

是否已经编写了库/头文件来使用不透明的指针/句柄从 C 中管理 C++ 对象?

我可以自己写一个,但我宁愿使用已经制定的解决方案,特别是如果它具有 fortran 绑定。

我的具体要求是:

  • 包装器生成工具(我的想法是使用 boost 预处理器)
  • 通过整数(而不是原始指针)句柄 (à la mpi) 处理对象,以提供句柄验证和特殊值以及 64 位 fortran 的一些可移植性。

谢谢

【问题讨论】:

    标签: c++ c interface fortran opaque-pointers


    【解决方案1】:

    在 C++ 中,只需提供函数

    Foo foo; // C++ object we want to access
    
    Foo &foo_factory(); // C++ function we want to call
    
    extern "C" void * get_foo() // extern "C" so C can call function
        { return (void *) & foo; } // cast it to an opaque void * so C can use it
    
    extern "C" void * create_foo()
        { return (void *) & foo_factory(); }
    

    和一个 C 头文件

    extern void * get_foo();
    extern void * create_foo();
    

    适当的访问器与 void* 之间的转换应该是你所需要的。

    您的 Fortran 编译器可能与 extern "C" 兼容(特别是如果它与 C 静态库兼容),或者您的 C++ 编译器可能与 extern "Fortran" 兼容。请参阅他们的手册。

    您也许可以找到一个代码生成器来为您执行此操作。如果可以的话,手动操作当然更安全。

    【讨论】:

    • 好吧,它需要创建/销毁/访问 C++ 对象。所以事情没那么简单。
    • 我将不得不考虑一下。以前这样做有一些问题,但现在我不记得它是什么了。谢谢你的回答
    【解决方案2】:

    一旦你有一个看起来像 C 的接口,对于 Fortran 绑定,你可能可以使用 ISO C 绑定来指示 Fortran 编译器如何调用 C 接口。通常,ISO C 绑定提供了一种标准且可移植的方法来双向连接 Fortran 和 C,尽管这两种语言的某些功能不受支持。以下是可能(未经测试)用于设置 Fortran 绑定的示例接口:

    module my_fortran_binding
    
    use iso_c_binding
    
    implicit none
    
    interface get_foo_interf
    
       function get_foo () bind (C, name="get_foo")
    
          import
    
          type (C_PTR) :: get_foo
    
       end function get_foo
    
    end interface get_foo_interf
    
    
    interface create_foo_interf
      etc....
    end create_foo_interf
    
    end module my_fortran_binding
    

    【讨论】:

    • 不幸的是,代码库在 fortran 77 中(令我惊讶的是非常古老的 fortran iv)
    • 您必须是彭博社的员工
    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多