【发布时间】:2019-08-13 09:23:26
【问题描述】:
为了与 C 程序的互操作性,Fortran 标准的 2003 年修订版引入了一个模块 iso_c_binding,它允许人们编写如下内容:
USE iso_c_binding, ONLY: c_int, c_float
INTEGER(KIND=c_int) :: x
REAL(KIND=c_float) :: y
保证在 C 端精确映射到 int x 和 float y。现在对于整数来说,这是至关重要的,因为即使 int 是 32 位,默认的 INTEGER 类型也可以(取决于编译器和平台)很好地包装为 64 位整数类型。
但是,对于浮点类型,以下映射似乎几乎是不可避免的:
REAL*4 (or) REAL -> float
REAL*8 (or) DOUBLE PRECISION -> double
所以问题来了:是否有任何实际平台或编译器对此不满意,例如sizeof(REAL*4) != sizeof(float)?
【问题讨论】:
-
这个问题似乎忽略了 real 类型的 C 绑定的种类常量。如果想映射 C
double,标准方法是REAL(KIND = C_DOUBLE) :: a_double。与映射 Cfloats 类似。因此,绝不有必要对DOUBLE PRECISION和默认REAL的映射方式做出假设。 -
我同意@JohnBollinger 的评论,但我认为这个问题的动机是“为什么我们需要
real(c_float) for_c而不仅仅是real for_c?”。对吗? -
...如果是这样,请您编辑问题以澄清,尤其是关于“几乎不可避免”使用默认实数和 DP 类型来映射 C 浮点类型的部分?
-
您还必须考虑到它们的
sizeof相同的可能性,但它们是不同的数据类型。甚至int也可以拥有与float相同的sizeof,但在内部它们是不同的。值得注意的是,扩展精度 REAL*10 存储在内存中的整个字中,因此存储在 128 位中,但四倍精度 REAL*16 存储在相同的 128 位中。 -
@summentier 是的,你应该这样做。任何时候有人可能会使用一些(完全符合标准的)选项来编译您的代码,这些选项会更改默认类型。如果您有默认的 8 字节整数,为了保持符合标准,您还应该使用 8 字节实数和逻辑。即使没有,许多人使用这些促销标志编译代码,只需在本网站上的问题中搜索即可。你永远不知道谁以及如何编译你的代码。
标签: c fortran fortran-iso-c-binding language-interoperability