在gfortran 6中,当一个值被整数除法截断时,会触发一个新的警告-Winteger-division
,如3/5
。
假设这是预期的结果,是否有办法更改代码以便不发出警告?例如:
program test
integer, parameter :: n = 3, m = 5
integer, parameter :: a = n/m
end program
至少比以下更麻烦的事情:
integer, parameter :: a = int(real(n)/real(m))
我想继续使用-Wall
(和-Werror
),我宁愿修改代码而不是使用特定文件的编译器选项,特定的编译器版本等。
答案 0 :(得分:2)
您可以使用-Wno-[warningname]
表单turn off specific warnings。仍然会报告任何未明确否定的警告。对于您的情况,您可以使用:
-Wall -Wno-integer-division
编辑:请注意,所有编译器都不使用-Wall
(例如,ifort)。也就是说,如果您使用-Wall
,并希望避免使用-Wno-integer-division
,那么我不知道在不使用real
和{{1的情况下阻止整数除法警告的任何方法进行适当的转换。
但是,由于您不想使用编译器选项,并且发现额外的类型转换很麻烦,只要您可以在int
不是a
的情况下生活(也就是说,只是normal parameter
)您可以编写一个程序,为您执行所有显式转换。例如:
integer
module utility_fcns
implicit none
contains
integer function intdiv(i1, i2) result(this)
integer, intent(in) :: i1, i2
this = int( real(i1) / real(i2) )
end function intdiv
end module utility_fcns
因此,使用program test
use utility_fcns, only: intdiv
implicit none
integer :: a
integer, parameter :: n = 3, m = 5
a = intdiv(n,m)
print *, a
end program test
输入的次数少一些,但结果不是参数......
如果这是一个交易破坏者,那么考虑将intdiv(n,m)
传递给a
的子程序。然后,任何改变其值的尝试都会发出错误,因此您会得到相同的行为。