gfortran编译器错误?

mgi*_*son 2 compiler-construction fortran gfortran

我在一个我们有fortran代码的自定义预处理器的环境中工作.我使用预处理器来切换逻辑参数作为一种穷人的函数指针.我今天意识到我的情况类似于:

  program main
  logical,parameter :: untrue=.false.
  if(untrue)then
    call func1()
  else
    call func2()
  endif
  end

  subroutine func2()
  print*,"Hello, World!"
  end
Run Code Online (Sandbox Code Playgroud)

换句话说,func1不是在任何地方定义的,但是,这与gfortran(版本4.4和4.6)一起编译,因为可能是编译器优化了该调用.我目前没有其他编译器可以检查,这段代码是否在别处编译?可能/应该将其视为编译器错误吗?

我切换逻辑开关(而不是包括/不包括代码)的部分原因是编译器仍然可以检查该代码块内的接口/语法(如果能够)(并针对不简单的事情发出适当的警告)函数调用).这是否意味着这些测试没有被执行,或仅仅是链接器不需要该函数,所以它都通过Ok?

Ian*_*anH 6

它不是编译器错误.缺少引用的外部子程序并不是标准要求Fortran处理器进行诊断的内容.其他处理器可能会或可能不会抱怨.像优化设置这样的事情可能会影响结果 - 英特尔Fortran 12.1.5抱怨优化关闭并且不会抱怨优化.

对于示例代码,其中func2是外部子程序,Fortran的程序单元的单独编译模型意味着不需要过程接口检查.对于许多处理器,它不太可能发生(实际上func2可能是在主程序之后很长时间编译的单独文件中,可能在不同的机器上,可能在主程序的源不再可用的情况下) .如果您需要保证过程接口检查,那么您需要确保过程具有显式接口,例如将它们放在模块中.Fortran 2003标准中引入并至少由gfortran 4.6支持的过程指针语言功能也可能有所帮助.