如何将c_int类型整数转换为默认kind整数?(可移植性验证)
Fortran中c_int转默认整数的可移植性问题
结论先行:用int(1_c_int)将c_int类型转换为默认kind整数是符合Fortran标准的,具备可移植性
为什么这是合规的?
- Fortran标准明确规定,
INT()函数的参数支持任意kind的整数类型——包括通过iso_c_binding引入的c_int。你看到的gfortran文档里提到的“INTEGER类型”,就是指所有整数kind,这不是编译器特有的规则,而是所有合规Fortran编译器必须遵循的标准要求。 - 当调用
INT(A)省略kind参数时,函数默认返回默认整数kind的结果,这一行为在标准中有明确定义,不存在编译器兼容性问题。
关于直接赋值的风险
你提到的integer :: i = 2_c_int虽然在多数场景下能正常运行,但确实没有标准保证:
- 若
c_int的kind与默认整数kind不同,且赋值的数值超出默认整数的表示范围,会触发未定义行为; - 即使数值在范围内,这种隐式转换的行为也未被Fortran标准强制规范,不同编译器可能存在差异,因此不推荐用于需要可移植性的代码。
更清晰的可移植写法
如果想进一步明确转换的目标kind,可以显式指定:
integer :: i = int(1_c_int, kind=kind(0))
这里kind(0)用来获取默认整数的kind值,写法更直观,但本质和int(1_c_int)等价,均为符合标准的可移植写法。
内容的提问来源于stack exchange,提问作者M0M0
相关产品推荐
相关产品推荐

