2

我今天遇到了一些看起来像这样的代码:

      subroutine foo()
      real blah
      integer bar,k,i,j,ll
      integer :: n_called=1
      save integer

      ...
      end

似乎这里的意图可能是save n_called,但这是否是保存所有整数的有效声明——或者它是否隐式声明了一个名为integer并保存它的变量?

4

2 回答 2

5

第二种解释是正确的。Fortran 有许多关键字,INTEGER是其中之一,但它没有保留字,这意味着关键字可以用作标识符,尽管这通常是一个糟糕的主意(但它继续到 C# 中,可以在关键字前面加上@和用它作为标识符,对吧?)

SAVE声明,即使它的目的n_called是肤浅的。Fortran 会自动保存所有具有初始化程序的变量,这就是代码可能按预期工作的原因。

 integer :: n_called=1

这里n_called是自动的SAVE。对于被迫维护/扩展/创建新的 Fortran 代码的 C/C++ 程序员来说,这通常是一个非常糟糕的惊喜 :)

于 2012-05-30T14:37:33.920 回答
3

我同意您的第二种解释,即该语句save integer隐式声明了一个名为的变量integer并为其赋予了save属性。当然,Fortran 没有禁止使用关键字作为程序实体名称的规则,尽管大多数明智的软件开发人员确实有这样的规则。

如果我尝试按照您提供的方式编译您的代码片段,我的编译器(英特尔 Fortran)不会抱怨。如果我implicit none在正确的位置插入它会报告错误

This name does not have a type, and must have an explicit type.   [INTEGER]

另一种解释是,它将save属性赋予所有整数变量,这似乎与语言标准不一致,这不是我遇到过的变体。

于 2012-05-30T14:27:25.927 回答