Compiler errors 为什么ifort-warn all在接口不匹配时抛出错误?

Compiler errors 为什么ifort-warn all在接口不匹配时抛出错误?,compiler-errors,fortran,compiler-warnings,intel-fortran,Compiler Errors,Fortran,Compiler Warnings,Intel Fortran,下面是一些示例代码: ! 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) e

下面是一些示例代码:

! 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会抛出错误?手册页特别指出,所有内容都不包括错误

我知道我可以修复代码,但我正在尝试为遗留代码库建立一个测试套件,我希望能够在开始进行代码更改之前运行带有警告的编译测试。

选项-warn all包括选项-warn interfaces,该选项用于激发外部过程的接口检查,在这些过程中可以确定这些接口。这通常适用于使用选项-gen interfaces编译的单独文件中的外部过程生成的接口

正是此选项-警告接口导致了错误消息。这可以检查外部子例程的接口,因为该子例程与引用它的程序位于同一文件中。您有两个选择,然后:

将外部子例程保存在不同的文件中,而不是使用-gen接口编译; 不要使用-警告接口。 对于后者,您可以使用

ifort -warn all -warn nointerfaces ...
除了界面检查之外,还有其他所有警告

然而,比这些中的每一个更好的是具有匹配接口。那么,应该指出的是

subroutine myprint(var) 
!    integer :: var
end subroutine 

在默认的隐式类型规则中有两种截然不同的东西。它们可能具有与没有可执行语句等相同的最终效果,但其特征却截然不同。

选项-warn all包括选项-warn接口,该选项-warn接口激发了外部过程的接口检查,在这些过程中可以确定这些接口。这通常适用于使用选项-gen interfaces编译的单独文件中的外部过程生成的接口

正是此选项-警告接口导致了错误消息。这可以检查外部子例程的接口,因为该子例程与引用它的程序位于同一文件中。您有两个选择,然后:

将外部子例程保存在不同的文件中,而不是使用-gen接口编译; 不要使用-警告接口。 对于后者,您可以使用

ifort -warn all -warn nointerfaces ...
除了界面检查之外,还有其他所有警告

然而,比这些中的每一个更好的是具有匹配接口。那么,应该指出的是

subroutine myprint(var) 
!    integer :: var
end subroutine 


在默认的隐式类型规则中有两种截然不同的东西。它们可能具有与没有可执行语句等相同的最终效果,但其特征却截然不同。

您可以在officisl支持论坛上询问供应商其具体行为的原因。我只是假设您知道,在子例程中,var隐式真实……您可以在officisl support forum了解他们具体行为的原因。我只是假设您知道var在子例程中是隐式真实的……感谢您的解释。这似乎仍然是一个bug,它被报告为一个错误,而不是一个警告,对吗?我不会在编译器中将其称为bug。您正在使用隐式接口调用过程,并要求编译器使用隐式-警告接口选项检查接口是否匹配。它做到了这一点,从某种意义上说,我是通过假装接口是显式的来收集的。请参阅文档,包括-gen interfaces选项,并查看生成的模块文件:它的行为就像涉及到一个模块,这确实使这成为一个错误而不是警告。是的,我可以看到有这个作为警告会很好。。。继续。。。很多时候,当以某种方式对接口进行黑客攻击时,各种调用变得更加简单,但是编译器允许您选择是否将其作为错误:您可以在警告阶段打开它,总而言之:你的代码是完全错误的,编译器超越了它的正常职责为你检测错误,这是很好的。但这只是因为你要求的。[举例来说,如果我看一看nagfor,你必须努力让它知道的坏电话通过。]是的,我想这很公平。我希望通过一次成功的编译,我能够得到尽可能多的警告,这样我可以更好地跟踪进度,但我想这并不重要。nointerfaces选项消除了这个错误,但也许我会让它保持打开状态,并首先解决这个特定的问题。谢谢谢谢你的解释。这似乎仍然是一个bug,它被报告为一个错误,而不是一个警告,对吗?我不会在编译器中将其称为bug。您正在使用隐式接口调用过程,并要求编译器使用隐式-警告接口选项检查接口是否匹配。它是这样做的,在一个
我通过假装接口是显式的来理解,查看文档,包括-gen interfaces选项,并查看生成的模块文件:它的行为就像涉及到模块一样,这确实使这成为一个错误而不是警告。是的,我可以看到有这个作为警告会很好。。。继续。。。很多时候,当以某种方式对接口进行黑客攻击时,各种调用变得更加简单,但是编译器允许您选择是否将其作为错误:您可以在警告阶段打开它,总而言之:你的代码是完全错误的,编译器超越了它的正常职责为你检测错误,这是很好的。但这只是因为你要求的。[举例来说,如果我看一看nagfor,你必须努力让它知道的坏电话通过。]是的,我想这很公平。我希望通过一次成功的编译,我能够得到尽可能多的警告,这样我可以更好地跟踪进度,但我想这并不重要。nointerfaces选项消除了这个错误,但也许我会让它保持打开状态,并首先解决这个特定的问题。谢谢