gpt4 book ai didi

c - 为什么是 ISO_C_BINDING

转载 作者:太空狗 更新时间:2023-10-29 17:16:25 26 4
gpt4 key购买 nike

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

我的 Fortran 和 C 接口(interface)在没有 iso_c_binding 的情况下成功工作,问题是我是否仍应显式绑定(bind)函数和变量。例如,这有效:

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 函数,为其编写接口(interface),并从 Fortran 程序中调用它。我不使用指针或可分配对象,我的所有代码都包含需要从 Fortran 子例程移至 C 的 int、char、float 和 logical。

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

最佳答案

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

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

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

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

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

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

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

如果特定项目的目标编译器套件支持 Fortran 2003 的必要部分,那么我想不出不使用 Fortran 2003 的 C 互操作性功能的正当理由。由此产生的健壮性和可移植性的改进使用此功能生成的代码很有吸引力。

关于c - 为什么是 ISO_C_BINDING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19524714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com