为何选择ISO_C_BINDING

jit*_*hsk 6 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)
Run Code Online (Sandbox Code Playgroud)

因此,在C函数中附加下划线,为其编写接口,并从fortran程序中调用它.我不使用指针或allocatables,我的所有代码都有int,char,float和逻辑,需要从fortran子程序移动到C.

iso_c_binding服务的确切目的是什么?有没有陷阱?作为一个例子,提到了在通过绑定使用字符串时的一个警告(参见"不幸的是,至少在GNU和英特尔编译器上,声明"部分).

Ian*_*anH 12

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

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

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

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

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

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

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

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