属性模块数据实体的 SAVE、PROTECTED 和 PARAMETER 之间的区别

Chr*_*h90 6 fortran

如果我想防止模块数据在程序执行过程中被更改,我在Fortran中似乎至少有三个选择:

1.使用SAVE语句

module mymod

implicit none
save

integer :: i = 1

end mymod
Run Code Online (Sandbox Code Playgroud)

2.使用PROTECTED属性

module mymod

implicit none

integer, protected :: i = 1

end mymod
Run Code Online (Sandbox Code Playgroud)

3.使用PARAMETER属性

module mymod

implicit none

integer, parameter :: i = 1

end mymod
Run Code Online (Sandbox Code Playgroud)

这三个选项有什么区别和影响?

fra*_*lus 5

这个答案解决了使用名为 的实体的非微妙方面i。在更复杂的情况下还需要考虑其他一些因素。它还使用术语“变量定义上下文”。宽松地说,这意味着变量可能出现在其值可能发生变化的位置。这就像成为一项作业的左侧;显示为 do 变量或对应于intent(out)参数。

  1. i只要可访问,就可以出现在变量定义上下文中。

  2. i(作为非指针对象),在可访问的情况下,只能出现在其模块或该模块的后代范围内的变量定义上下文中。

  3. i永远不能出现在变量定义上下文中:它是常量而不是变量。

save属性(在当前标准中任何模块变量都具有此属性;即使i在第二个示例中也被保存)不控制修改。