如何使用 extern
将 fortran interface
导入到 C 中?
假设我有以下 fortran 模块:
!swapper module
module swapper
interface swap
module procedure swap_r, swap_i, swap_c
end interface
contains
!subroutine implementations here:
!swap_r takes two double precision as argument
!swap_i takes two integers as argument
!swap_c takes two characters as argument
end module swapper
那么我可以用 C 语言执行以下操作吗?
extern "C" void __swapper_MOD_swap(double*, double*)
extern "C" void __swapper_MOD_swap(int*, int*)
extern "C" void __swapper_MOD_swap(char*, char*)
或者,如果我 promise 仅使用 double 字调用 swap
,我可以专门这样做吗?
extern "C" void __swapper_MOD_swap(double*, double*)
最佳答案
看来您实际上正在使用 C++。但首先让我们回答 C 或 C 风格的 C++:
不,你不能这样做
extern "C" void __swapper_MOD_swap(double*, double*)
您不能对三种不同类型的参数执行此操作,甚至不能对单一类型的参数执行此操作。
实际上,库中一开始就不应该有任何 __swapper_MOD_swap
。
Fortran 的作用是为三个特定子例程 swap_r、swap_i、swap_c
保留一个接口(interface)(这只是如何调用某些内容的描述),并允许您通过名称调用它交换
。
但是模块中没有实际的子例程swap
!!!Fortran 只会让您以不同的名称调用这三个细节,仅此而已。
无法像泛型一样从 C 调用这些函数。 C 没有这种类型的泛型!(它确实有一些使用 void*
对任何类型进行操作的函数)。
在 C++ 中,您实际上可以创建专门针对不同类型的泛型,并且您可以将 Fortran 过程作为泛型调用,但您必须自己告诉 C++!您可以创建一个模板并手动专门化该模板以调用适当的 extern "C"
函数。
例如,请参阅我的标题 https://github.com/LadaF/PoisFFT/blob/master/src/poisfft.h我在其中创建了一个链接到 extern "C"struct
的 C++ 类和一些 extern "C"
函数,但这些函数都是在 Fortran 中实现的。
最后,请勿使用 __swapper_MOD_
符号。使用 bind(C,name="some_name")
创建一些 Fortran 绑定(bind),并通过 extern "C"
调用 some_name
,因为不同的 Fortran 编译器会这样做使用不同的名称修改方案。
关于c - 将接口(interface)模块程序从 Fortran 导入到 C 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44533633/