为何选择ISO_C_BINDING

时间:2013-10-22 17:40:12

标签: c fortran fortran-iso-c-binding

我正在研究一些fortran-calling-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程序中调用它。 我不使用指针或allocatables,我的所有代码都有int,char,float和逻辑,需要从fortran子程序移动到C.

iso_c_binding的用途是什么?有没有陷阱?例如,this在通过绑定使用字符串时提到了一个警告(参见“不幸的是,至少在GNU和英特尔编译器上,声明”部分)。

2 个答案:

答案 0 :(得分:12)

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

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

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

与使用内在模块相比,C互操作性要多得多。将USE ISO_C_BINDING置于作用域的顶部不会自行更改任何内容,禁止访问某些标识符。

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

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

(链接的fortran wiki页面中的“不幸......”评论似乎是对Fortran中字符数组的赋值如何工作的误解 - 它与C互操作性本身无关,禁止它的要求Fortran中的LEN = 1个字符数组,可与C char数组互操作。)

如果特定项目的目标编译器套件支持Fortran 2003的必要部分,那么我认为没有正当理由不使用Fortran 2003的C互操作性功能。结果的稳健性和可移植性得到改进使用此功能产生的代码非常引人注目。

答案 1 :(得分:4)

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