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?
它不是编译器错误.缺少引用的外部子程序并不是标准要求Fortran处理器进行诊断的内容.其他处理器可能会或可能不会抱怨.像优化设置这样的事情可能会影响结果 - 英特尔Fortran 12.1.5抱怨优化关闭并且不会抱怨优化.
对于示例代码,其中func2是外部子程序,Fortran的程序单元的单独编译模型意味着不需要过程接口检查.对于许多处理器,它不太可能发生(实际上func2可能是在主程序之后很长时间编译的单独文件中,可能在不同的机器上,可能在主程序的源不再可用的情况下) .如果您需要保证过程接口检查,那么您需要确保过程具有显式接口,例如将它们放在模块中.Fortran 2003标准中引入并至少由gfortran 4.6支持的过程指针语言功能也可能有所帮助.
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |