Fortran中能否用函数结果指定字符长度?编译器差异解析
Fortran中通过成员函数结果指定字符长度的标准合规性分析
最小可运行示例
module lib type t contains procedure::f,g end type contains integer function f(this) class(t),intent(in)::this f=10 end function g(this)result(r) class(t),intent(in)::this character(len=this%f())::r r='42' end end program prog use lib type(t)::o print*,o%g() end
各编译器编译结果
- GNU gfortran 11.1.0:触发内部编译器错误(段错误),报错信息如下:
f951: internal compiler error: Segmentation fault 0x16463d7 internal_error(char const*, ...) ???:0 0x64b47c gfc_find_derived_vtab(gfc_symbol*) ???:0 0x672605 gfc_reduce_init_expr(gfc_expr*) ???:0 0x6572e3 gfc_match_char_spec(gfc_typespec*) ???:0 0x65e227 gfc_match_decl_type_spec(gfc_typespec*, int) ???:0 0x65f93c gfc_match_data_decl() ???:0 0x6d6236 gfc_parse_file() ???:0 Please submit a full bug report
- NAG nagfor 7.1:编译失败,报错:
Error: line 13: Reference to non-specification function F in specification expression - Intel ifort 2021.8.0、ifx 2023.0.0:编译成功
- Nvidia nvfortran 22.9:编译成功
核心问题与解答
问题聚焦于代码中的character(len=this%f())::r行:
Fortran标准的规定
根据Fortran标准,用于声明实体属性(如字符长度)的规范表达式中,仅允许调用规范函数。规范函数需满足以下关键条件:
- 必须是
PURE(纯函数)或ELEMENTAL(元素函数); - 函数调用的参数只能是常量、枚举常量,或规范部分已声明的、类型参数为常量的实体;
- 不能产生副作用。
本例中的f函数既未声明为PURE,调用时的this是过程的虚参,不属于规范表达式允许的参数范畴,因此这行代码不符合Fortran标准。
各编译器行为分析
- NAG编译器严格遵循标准,报错指出引用非规范函数,行为正确;
- Intel与Nvidia编译器允许该写法,属于它们提供的非标准扩展特性;
- GNU gfortran出现段错误属于编译器bug:即便代码不符合标准,编译器也应输出明确的错误提示,而非崩溃。
内容的提问来源于stack exchange,提问作者V T
相关产品推荐
相关产品推荐

