编译器超前查看局部变量是如何使用的,然后假设变量不会随子程序调用而变化。在下例中,子程序中使用的指针使编译器优化策略失败,并且结果无法预料。要使此例正确工作,需用 -xalias=actual 标志进行编译:
program foo
integer i
call take_loc(i)
i = 1
print * , i
call use_loc()
print * , i
end
subroutine take_loc(i)
integer i
common /loc_comm/ loc_i
loc_i = loc(i)
end subroutine take_loc
subroutine use_loc()
integer vi1
pointer (pi,vi)
common /loc_comm/ loc_i
pi = loc_i
vi1 = 3
end subroutine use_loc
|
take_loc 会获取 i 的地址,并将其保存起来。use_loc 将使用它。这违反了 Fortran 标准。
用 -xalias=actual 标志进行编译,将会通知编译器应将传给子程序的所有参数在编译单元内看作是全局性的,从而使编译器在对作为实际参数出现的变量作出假设时更加小心。
应避免诸如此类违反 Fortran 标准的编程习惯。