c - 将接口(interface)模块程序从 Fortran 导入到 C 中

标签 c fortran language-interoperability

如何使用 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/

相关文章:

unix - 从 Cray Fortran 获取当前主机名

c - 为什么在将复数从 fortran 传递到 c 时不能 printf

Hadoop 互操作性

c - 在 C 中去除前导和尾随空格的最佳算法

c - 允许C动态加载库到 "publish"函数使用

algorithm - 如何在DLL中存储大量只读数据?

scala - Haskell scala 互操作性

python - python 编译C函数的问题

c - C 中的多线程读取和打印非常大的文件

fortran - fortran中的过程指针