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