如何检查fortran real是否与C float兼容?

Mic*_*son 2 c fortran fortran-iso-c-binding

我正在使用iso-c绑定和模块/接口等在fortran和C之间桥接一些遗留代码.

通常,当将fortran数组传递给C时,我只需将其复制到另一个正确的iso-c-binding类型的数组中.但是有些代码要求我传递一个大的(多GB)数组.在这种情况下复制它是不明智的.此外,由于它来自第三方代码,real(c_float)因此无法更改fortran数组的类型.

但是我很乐意抛出异常,或者如果底层fortran数组与基于C float的API不兼容,则无法编译.

有没有办法检查默认值real是否与C兼容floatdouble在编译时(或运行时)?

如果重要的话,我正在使用intel fortran和C编译器.

Ian*_*anH 5

默认REAL类型与可与floatC语言互操作的REAL类型之间的比较只是一个简单的整数比较.

您可以使此比较触发编译错误或运行时错误.

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_FLOAT    

! -99 is never a valid kind - so this will fail at compile time 
! if the test condition is false.
REAL(MERGE(KIND(1.0), -99, C_FLOAT == KIND(1.0)) :: dummy
Run Code Online (Sandbox Code Playgroud)

要么

IF (C_FLOAT /= KIND(1.0))  &
    ERROR STOP 'Default REAL isn''t interoperable with FLOAT!!'
Run Code Online (Sandbox Code Playgroud)

如果Fortran处理器没有与其互操作的REAL类型,则C_FLOAT本身可能具有负值.

(对于某些15.0.x版本的ifort,以下内容可用于编译时检查变体:

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_FLOAT
INTEGER, PARAMETER :: dummy_rk = MERGE(C_FLOAT, -99, KIND(1.0) == C_FLOAT)
! -99 is never a valid kind - so this will fail at compile time 
! if the test condition is false.
REAL(dummy_rk) :: dummy
Run Code Online (Sandbox Code Playgroud)