gfortran环境下C调用Fortran的logical参数应使用什么正确类型?
正确参数类型及解决方案
最优兼容方案(推荐,符合CRAN要求)
直接修改Fortran代码使用Fortran标准提供的C互操作模块,从根源避免类型匹配问题:
subroutine proc1(x) bind(C, name='proc1') use, intrinsic :: iso_c_binding logical(c_bool), intent(in) :: x end
对应C侧代码直接使用_Bool类型即可,不需要加函数名后缀:
#include <stdbool.h> void proc1(bool *x); int main() { bool x = false; proc1(&x); return 0; }
该方案完全符合跨语言调用标准,无平台差异,LTO编译不会触发任何警告。
无法修改Fortran代码的兼容方案
gfortran默认未指定kind的LOGICAL类型与默认INTEGER类型宽度一致,常规平台下为32位有符号整数,C侧需要使用固定宽度的int32_t类型匹配:
#include <stdint.h> void proc1_(int32_t *x); int main() { int32_t x = 0; // 0对应Fortran的.false.,非0对应.true. proc1_(&x); return 0; }
注意不要使用int_fast32_t,该类型是平台相关的别名,LTO类型校验无法识别为与Fortran LOGICAL匹配的类型,仍然会触发警告。如果你的编译环境指定了-fdefault-integer-8参数将默认整数设为64位,则对应C侧使用int64_t即可。
警告原因说明
LTO编译时会校验跨编译单元的函数类型签名,你之前遇到的警告原因如下:
_Bool在C中是1字节宽度,和默认4字节宽度的FortranLOGICAL类型宽度不匹配int_fast32_t的类型别名签名和gfortran内部给LOGICAL打的类型标签不一致,即使宽度相同也无法通过校验
gfortran相关文档查询位置
直接查询本地安装的gfortran官方使用手册,对应章节如下:
- 「C Interoperability」章节:明确C和Fortran互操作的类型对应规则、
BIND(C)语法要求 - 「Type Representation」章节:说明默认
LOGICAL、INTEGER等内置类型的存储宽度、对齐规则
内容的提问来源于stack exchange,提问作者Szabolcs
相关产品推荐
相关产品推荐

