是否已经编写了库/头文件来使用不透明的指针/句柄从 C 中管理 C++ 对象?
我可以自己写一个,但我宁愿使用已经制定的解决方案,特别是如果它具有 fortran 绑定。
我的具体要求是:
- 包装器生成工具(我的想法是使用 boost 预处理器)
- 通过整数(而不是原始指针)句柄(à la mpi)处理对象,以提供句柄验证和特殊值以及 64 位 fortran 的一些可移植性。
谢谢
是否已经编写了库/头文件来使用不透明的指针/句柄从 C 中管理 C++ 对象?
我可以自己写一个,但我宁愿使用已经制定的解决方案,特别是如果它具有 fortran 绑定。
我的具体要求是:
谢谢
在 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 的接口,对于 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