“保存”一个共同的块

时间:2012-02-23 23:20:32

标签: fortran fortran-common-block

我正在处理一些广泛使用COMMON块的遗留代码,有时会使用SAVE语句。在查阅Fortran标准后,它说:

  

公共块名称的出现在SAVE语句中以斜杠开头,后面跟一个斜杠,可以指定该公共块中的所有实体。

在什么情况下将变量放在公共块中并不意味着SAVE?由于变量必须可以在包含该公共块的任何其他程序单元中访问,所以它怎么可能不是SAVE

2 个答案:

答案 0 :(得分:6)

我不得不查一查,因为我的印象和你一样。

似乎只有未命名的,所谓的空白公共块中的变量才能在整个程序中保留其定义状态。从子程序返回时,命名公共块中未保存的变量将变为未定义,除非另一个当前活动的程序单元包含同一公共块的公共语句。

从标准(Fortran 77,但最新的包含类似的措辞):

  17.3导致实体未定义的事件
  [...]
  6.在子程序中执行RETURN语句或END语句会导致子程序中的所有实体变为未定义,但以下情况除外:
  [...]
  d。在子程序中出现的命名公共块中的实体,并出现在至少一个直接或间接引用子程序的其他程序单元中

答案 1 :(得分:3)

Fortran 77时代的许多编译器“保存”了所有本地过程变量,无论是否指定了“SAVE”。这是遗留程序在现代编译器中失败的常见原因,当语言标准允许时,它们会在超出范围时取消定义变量。可能那些较旧的编译器也会在程序运行期间保持所有公共变量的值,即使语言标准不需要这样做。