在 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
(,我宁愿修改代码而不是摆弄特定文件、特定编译器版本等的编译器选项。
您可以使用表单关闭特定警告-Wno-[warningname]
.任何未明确否定的警告仍会报告。对于您的情况,您可以使用:
-Wall -Wno-integer-division
编辑:请注意,并非所有编译器都使用-Wall
(例如,ifort(。也就是说,如果您使用-Wall
,并希望避免使用-Wno-integer-division
,那么我不知道有什么方法可以在不使用real
和int
进行正确转换的情况下防止整数除法警告。
但是,由于您不想使用编译器选项,并且发现额外的类型转换很麻烦,那么只要您可以a
不成为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
传递给带有intent(in)
的子例程。然后,任何更改其值的尝试都会发出错误,因此您将获得相同的行为。