2016-03-02 83 views
1

下面是一些示例代码:为什么ifort - 在接口不匹配时抛出所有抛出错误?

! Author: Svetlana Tkachenko [email protected] 
! 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不包括错误

我知道我只能修复代码,但我正在尝试为遗留代码库设置测试套件,并且希望能够在开始进行代码更改之前运行带有警告的编译测试。

+0

您可以(应该)在实际支持论坛上询问供应商,了解其具体行为的原因。 –

+0

我只是假设你知道'var'在子程序中隐含地是'real' ... –

回答

5

选项-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 

是在默认的隐式类型规则存在两个非常不同的事情。它们可能具有与没有可执行语句(等等)相同的最终效果,但其特性完全不同。

+0

感谢您的解释。它仍然看起来像一个错误,这被报告为一个错误,而不是一个警告,对吧? – naught101

+0

我不会称它为编译器中的错误。您正在调用带有隐式接口的过程,并要求编译器检查(使用隐含的“-warn interfaces”选项)接口是否匹配。它在某种意义上(我收集到)假装接口是显式的(参见文档,包括'-gen-interfaces'选项,并查看生成的模块文件:它就好像涉及模块一样),这确实使这是一个错误,而不是一个警告。是的,我可以看到有这个警告会很好... cont – francescalus

+0

...并且有很多时候,当以某种方式进行黑客接口时,各种调用变得更加简单,但是编译器允许您选择是否使这个错误成为错误:您可以在“警告阶段”中将此然后在没有接口检查的情况下重新编译,作为下一步。 – francescalus

相关问题