Why ISO_C_BINDING

8

我正在处理一些关于Fortran调用C语言的代码,并不确定如何使用iso_c_binding模块。

没有使用iso_c_binding,我已经成功地编写了Fortran和C语言接口,现在的问题是是否仍然需要显式地绑定函数和变量。例如,以下代码可以正常工作:

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程序调用它。

iso_c_binding的确切目的是什么?有什么需要注意的地方吗?例如,这个提到了在使用绑定时处理字符串时的一个警告(请参阅“不幸的是,在至少GNU和Intel编译器上,该语句”部分)。

我不使用指针或可分配变量,我的所有代码都包含需要从Fortran子程序移动到C的整数、字符、浮点数和逻辑变量。


你读了最新标准的第15章吗?http://www.j3-fortran.org/doc/year/10/10-007.pdf - milancurcic
不幸的是,在GNU和Intel编译器上,这个语句只是将标量赋值给数组的工作方式,没有其他作用。 - Vladimir F Героям слава
2个回答

13

这个问题中的“工作”方法本质上是与Fortran处理器相关的。由于历史惯例,在某些操作系统中这是一种常见的排列方式,但它并不是普遍存在的。在编译器族中,调用约定的方面会随着编译选项而有所不同,并且在编译器版本上也会有所不同,可能会破坏这种方法。

ISO_C_BINDING只是一个模块,提供了一些常数、一些类型和一些过程。它恰好是由标准规定并由编译器供应商提供的一个模块,但除此之外它没有任何特殊的功能。

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

C互操作性远不止使用内部模块这么简单。仅仅在一个范围的顶部放置USE ISO_C_BINDING并不会改变任何内容,除了使某些标识符可访问之外。

BIND(C)属性必须应用于需要在C和Fortran之间进行交互的变量、派生类型、公共块和过程。在某些情况下,这个属性还指定了绑定名称(C名称)的内容。对于派生类型和常规块,这可能会改变组件的对齐方式和排序方式,而对于过程则可能会改变过程调用约定的某些方面。

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

(在链接的Fortran wiki页面中的“不幸的是...”评论似乎是对在Fortran中分配字符数组的工作方式的误解——它与C互操作性本身无关,除了要求在Fortran中与C字符数组兼容的是长度为1的字符数组。)

如果特定项目的目标编译器支持Fortran 2003的必要部分,那么我想不到不使用Fortran 2003的C互操作功能的有效理由。使用此功能所得到的代码的鲁棒性和可移植性的提高是引人注目的。

我在想,为什么不默认使用C++可互操作的整数和浮点类型呢?我的意思是,关于“real”和“double precision”精度与“real(dp)”之间存在整个问题,其中“dp = selected_real_type(N)”或其他情况。除非特定情况下给定精度真正重要,否则为什么不默认为“dp = c_double”?(然后一致地应用于整数...)。既然似乎必须编写冗长的代码...有什么意见吗? - Mahé

4

ISO_C_Binding是语言标准的一部分,它使得Fortran和C标准之间的接口具有可移植性。在特定操作系统上使用特定编译器的接口工作不具备可移植性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接