6

我正在编写一些 fortran 调用 C 代码,但不清楚 iso_c_binding 模块的使用。

我有 fortran 和 C 接口在没有iso_c_binding 的情况下成功运行,问题是我是否仍应显式绑定函数和变量。例如,这有效:

program testprog
...
interface
  subroutine c_parser(param)
    integer, intent(in) :: param
  end subroutine
end interface

integer :: a
call c_parser(a)
..
end program

/****************/

void c_parser_ (int* param)

因此,将下划线添加到 C 函数中,为其编写接口,然后从 fortran 程序中调用它。我不使用指针或可分配对象,我所有的代码都有需要从 fortran 子例程移动到 C 的 int、char、float 和逻辑。

iso_c_binding 的确切用途是什么?有什么陷阱吗?例如,提到了通过绑定使用字符串时的警告(请参阅“不幸的是,至少在 GNU 和 Intel 编译器上,声明”部分)。

4

2 回答 2

12

问题中的“工作”方法本质上是特定于 Fortran 处理器的。由于历史惯例,这是某些操作系统上的常见安排,但绝不是无处不在。在编译器系列中,调用约定的各个方面将随编译选项而变化,并且随着编译器版本的不同而变化,可能会破坏该方法。

ISO_C_BINDING 只是一个提供一些常量、一些类型和一些过程的模块。它恰好是由标准指定并由编译器供应商提供的一个(它是一个内在模块),但除此之外它没有特殊的权力。

这些常量、类型和过程都可以帮助 Fortran 程序员以可移植的方式创建与 C 对应物兼容的数据对象、数据指针和过程指针。一些类型和过程是特殊的——程序员不一定通过编写自己的 Fortran 代码来创建它们。

C 互操作性远不止使用内部模块。将 USE ISO_C_BINDING 放在作用域的顶部本身并不会改变任何东西,除非使某些标识符可以访问。

BIND(C) 属性必须应用于需要在 C 和 Fortran 之间进行互操作的变量、派生类型、公共块和过程。在某些情况下,此属性还指定事物的绑定名称(C 名称)。对于派生类型和通用类型,这可能会改变组件的对齐方式和顺序,而对于过程,它可能会改变过程调用约定的各个方面。

还有一组关于数据对象和可互操作过程的性质的要求,程序员必须遵循这些要求。

(链接的 fortran wiki 页面中的“不幸的是......”评论似乎是对 Fortran 中字符数组的赋值方式的误解——它与 C 互操作性本身无关,除非它是 LEN= 1 Fortran 中可与 C 字符数组互操作的字符数组。)

如果特定项目的目标编译器套件支持 Fortran 2003 的必要部分,那么我认为没有正当理由不使用 Fortran 2003 的 C 互操作性功能。结果代码的健壮性和可移植性的改进从使用这个功能来说是引人注目的。

于 2013-10-22T19:58:53.730 回答
4

ISO_C_Binding 是语言标准的一部分,它使 Fortran C 标准和可移植之间的接口成为可能。弄清楚特定操作系统上的一对特定编译器之间的接口如何工作是不可移植的。

于 2013-10-22T18:42:48.663 回答