为什么 ifort -warn all 在接口不匹配时抛出错误?
Why does ifort -warn all throw errors on interface mismatch?
这是一些示例代码:
! Author: Svetlana Tkachenko svetlana@members.fsf.org
! License: GPLv3 or later
subroutine myprint(var)
! integer :: var
! print *, 'Hi, my ', var
end subroutine
module testing
type triangle
integer :: point(3)
end type
end module
program main
use testing
type(triangle) :: mytriangle
mytriangle%point(1)=5
call myprint(mytriangle%point(1))
end program
它与 ifort -c file.f90
一起工作正常,但 ifort -warn all -c file.f90
导致错误:
blah.f90(4): warning #6717: This name has not been given an explicit type. [VAR]
subroutine myprint(var)
-------------------^
blah.f90(4): remark #7712: This variable has not been used. [VAR]
subroutine myprint(var)
-------------------^
blah.f90(19): error #6633: The type of the actual argument differs from the type of the dummy argument. [POINT]
call myprint(mytriangle%point(1))
---------------------------^
compilation aborted for blah.f90 (code 1)
为什么 -warn all
会抛出错误?手册页明确指出 all
不 包含错误。
我知道我可以修复代码,但我正在尝试为遗留代码库设置测试套件,并且我希望能够 运行 在开始制作之前进行带有警告的编译测试代码更改。
选项 -warn all
包括选项 -warn interfaces
激发对可以确定此类接口的外部过程进行接口检查。这通常用于从使用选项 -gen-interfaces
.
编译的单独文件中的外部过程生成的接口
正是这个选项 -warn interfaces
导致了错误消息。这能够检查外部子例程的接口,因为该子例程与引用它的程序位于同一文件中。那么你有两个选择:
- 将外部子例程放在不同的文件中,未使用
-gen-interfaces
编译;
- 不要使用
-warn interfaces
。
对于后者,您可以使用
ifort -warn all -warn nointerfaces ...
除了接口检查之外的所有其他警告。
但是,最好是拥有匹配的界面。那么需要注意的是,
subroutine myprint(var)
! integer :: var
end subroutine
和
subroutine myprint(var)
integer :: var
end subroutine
在存在默认隐式类型规则的情况下,这是两个截然不同的事情。它们可能与没有可执行语句(等)具有相同的最终效果,但特性却大不相同。
这是一些示例代码:
! Author: Svetlana Tkachenko svetlana@members.fsf.org
! License: GPLv3 or later
subroutine myprint(var)
! integer :: var
! print *, 'Hi, my ', var
end subroutine
module testing
type triangle
integer :: point(3)
end type
end module
program main
use testing
type(triangle) :: mytriangle
mytriangle%point(1)=5
call myprint(mytriangle%point(1))
end program
它与 ifort -c file.f90
一起工作正常,但 ifort -warn all -c file.f90
导致错误:
blah.f90(4): warning #6717: This name has not been given an explicit type. [VAR]
subroutine myprint(var)
-------------------^
blah.f90(4): remark #7712: This variable has not been used. [VAR]
subroutine myprint(var)
-------------------^
blah.f90(19): error #6633: The type of the actual argument differs from the type of the dummy argument. [POINT]
call myprint(mytriangle%point(1))
---------------------------^
compilation aborted for blah.f90 (code 1)
为什么 -warn all
会抛出错误?手册页明确指出 all
不 包含错误。
我知道我可以修复代码,但我正在尝试为遗留代码库设置测试套件,并且我希望能够 运行 在开始制作之前进行带有警告的编译测试代码更改。
选项 -warn all
包括选项 -warn interfaces
激发对可以确定此类接口的外部过程进行接口检查。这通常用于从使用选项 -gen-interfaces
.
正是这个选项 -warn interfaces
导致了错误消息。这能够检查外部子例程的接口,因为该子例程与引用它的程序位于同一文件中。那么你有两个选择:
- 将外部子例程放在不同的文件中,未使用
-gen-interfaces
编译; - 不要使用
-warn interfaces
。
对于后者,您可以使用
ifort -warn all -warn nointerfaces ...
除了接口检查之外的所有其他警告。
但是,最好是拥有匹配的界面。那么需要注意的是,
subroutine myprint(var)
! integer :: var
end subroutine
和
subroutine myprint(var)
integer :: var
end subroutine
在存在默认隐式类型规则的情况下,这是两个截然不同的事情。它们可能与没有可执行语句(等)具有相同的最终效果,但特性却大不相同。