我今天遇到了一些看起来像这样的代码:
subroutine foo()
real blah
integer bar,k,i,j,ll
integer :: n_called=1
save integer
...
end
似乎这里的意图可能是save n_called
,但这是否是保存所有整数的有效声明——或者它是否隐式声明了一个名为integer
并保存它的变量?
我今天遇到了一些看起来像这样的代码:
subroutine foo()
real blah
integer bar,k,i,j,ll
integer :: n_called=1
save integer
...
end
似乎这里的意图可能是save n_called
,但这是否是保存所有整数的有效声明——或者它是否隐式声明了一个名为integer
并保存它的变量?
第二种解释是正确的。Fortran 有许多关键字,INTEGER
是其中之一,但它没有保留字,这意味着关键字可以用作标识符,尽管这通常是一个糟糕的主意(但它继续到 C# 中,可以在关键字前面加上@
和用它作为标识符,对吧?)
该SAVE
声明,即使它的目的n_called
是肤浅的。Fortran 会自动保存所有具有初始化程序的变量,这就是代码可能按预期工作的原因。
integer :: n_called=1
这里n_called
是自动的SAVE
。对于被迫维护/扩展/创建新的 Fortran 代码的 C/C++ 程序员来说,这通常是一个非常糟糕的惊喜 :)
我同意您的第二种解释,即该语句save integer
隐式声明了一个名为的变量integer
并为其赋予了save
属性。当然,Fortran 没有禁止使用关键字作为程序实体名称的规则,尽管大多数明智的软件开发人员确实有这样的规则。
如果我尝试按照您提供的方式编译您的代码片段,我的编译器(英特尔 Fortran)不会抱怨。如果我implicit none
在正确的位置插入它会报告错误
This name does not have a type, and must have an explicit type. [INTEGER]
另一种解释是,它将save
属性赋予所有整数变量,这似乎与语言标准不一致,这不是我遇到过的变体。