我正在处理一些广泛使用COMMON
块的遗留代码,有时会使用SAVE
语句。在查阅Fortran标准后,它说:
公共块名称的出现在
SAVE
语句中以斜杠开头,后面跟一个斜杠,可以指定该公共块中的所有实体。
在什么情况下将变量放在公共块中并不意味着SAVE
?由于变量必须可以在包含该公共块的任何其他程序单元中访问,所以它怎么可能不是SAVE
?
答案 0 :(得分:6)
我不得不查一查,因为我的印象和你一样。
似乎只有未命名的,所谓的空白公共块中的变量才能在整个程序中保留其定义状态。从子程序返回时,命名公共块中未保存的变量将变为未定义,除非另一个当前活动的程序单元包含同一公共块的公共语句。
从标准(Fortran 77,但最新的包含类似的措辞):
17.3导致实体未定义的事件
[...]
6.在子程序中执行RETURN语句或END语句会导致子程序中的所有实体变为未定义,但以下情况除外:
[...]
d。在子程序中出现的命名公共块中的实体,并出现在至少一个直接或间接引用子程序的其他程序单元中
答案 1 :(得分:3)
Fortran 77时代的许多编译器“保存”了所有本地过程变量,无论是否指定了“SAVE”。这是遗留程序在现代编译器中失败的常见原因,当语言标准允许时,它们会在超出范围时取消定义变量。可能那些较旧的编译器也会在程序运行期间保持所有公共变量的值,即使语言标准不需要这样做。