You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字节宽度的Fortran LOGICAL类型宽度不匹配
  • int_fast32_t的类型别名签名和gfortran内部给LOGICAL打的类型标签不一致,即使宽度相同也无法通过校验
gfortran相关文档查询位置

直接查询本地安装的gfortran官方使用手册,对应章节如下:

  • 「C Interoperability」章节:明确C和Fortran互操作的类型对应规则、BIND(C)语法要求
  • 「Type Representation」章节:说明默认LOGICAL、INTEGER等内置类型的存储宽度、对齐规则

内容的提问来源于stack exchange,提问作者Szabolcs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:54:03