Fab*_*tor 28 fortran gfortran fortran90
我是否需要将implicit none每个功能和子程序放入其中?
或者它是否足以将它放在包含这些函数和子例程的模块的开头?
或者它是否足以将它放在使用这些模块的程序的开头?
从观察其他人的工作代码,implicit none包含在所有这些地方.我不确定这是否是冗余的,因为implicit none从子程序中删除仍然编译并产生相同的输出.
顺便说一句,我正在使用gfortran fortran 90.
fra*_*lus 24
该implicit声明(含implicit none)适用于作用域单元.这样的事情被定义为
BLOCK构造,派生类型定义,接口主体,程序单元或子程序,不包括其中的所有嵌套作用域单元
这"排除其中的所有嵌套的作用域单元"表明implicit none在模块中定义的每个函数和子程序(统称为程序)中可能有必要/期望.但是,模块中包含的内部过程存在基于主机作用域单元的默认映射.因此,implicit none在模块中,没有必要在包含的过程中使用它.
此主机作用域单元规则同样适用于内部程序.这意味着implicit none在主程序中涵盖了其中包含的所有程序; 这同样适用于模块程序的内部程序.块结构也会看到这一点,implicit甚至不允许在其中一个语句中使用该语句.
但是,外部函数/子例程不会从程序或模块继承隐式行为,并且模块不会从use它们的程序/其他模块继承它.这显然是有道理的,因为隐式类型必须在编译时知道并且无论其最终用途如何都要明确定义.
此外,一个人做不到
implicit none
use somemodule
end program
Run Code Online (Sandbox Code Playgroud)
一个implicit语句必须遵守所有use语句.
该主机作用域单元规则特别不适用于接口主体. IanH的回答激发了这种异常,但重新压力是一件非常重要的事情.它引起了很多困惑.
module mod
implicit none
interface
subroutine external_sub()
! The default implicit typing rules apply here unless there is an implicit
! statement, such as implicit none. Those from the module aren't in force here.
end subroutine
end interface
end module
Run Code Online (Sandbox Code Playgroud)
关于implicit none从子程序中删除的测试:如果代码有效,implicit none那么它必须是有效的且没有该语句的相同.必须在前一种情况下显式声明所有实体,因此后者不会应用任何隐式规则.
不,是(有点)和不.
每个程序单元一次(这与每个程序不一样)并且在每个接口体中就足够了.
一个程序单元或者是一个主程序,模块,一个外部子程序(一个函数或包含其他类型的程序单元的语句之后未出现的子程序的子程序),块数据程序单元或子模块.除非使用IMPLICIT语句另行指定,否则每个程序单元中的默认值是以IN开头的默认整数和其他所有默认实例的默认映射.
相同的原则适用于接口主体 - 因为它们应该是另一个程序单元中定义的过程的规范部分的快照.除非另有说明,否则该其他程序单元将具有默认映射,因此除非另有指定,否则接口主体具有默认映射.
在程序单元内部,内部子程序或模块子程序继承在其主机中指定的任何隐式类型,在子程序中没有"本地"IMPLICIT语句.
IMPLICIT NONE的冗余规范是无害的.您经常会看到以前外部子程序的子程序已放入模块中.
这是一个基于对我有用的非正式答案.
我的Fortran代码有两种类型的文件 - 包含主程序和包含单个模块的文件.在每种文件中,IMPLICIT NONE出现在"program foo"或"module foo"语句之后以及顶部的USE语句之后.它不会出现在子程序或函数中,因为这将是多余的.