Rename() 内在函数副作用?
Rename() intrinsic function side effects?
GNU fortran 手册部分“10.5.2.126 Rename Intrinsic (function)”说 "Due to the side effects performed by this intrinsic, the function form is not recommended."
另一方面,“8.11.9.213 Rename Intrinsic (subroutine)”部分说 "Some non-GNU implementations of Fortran provide this intrinsic as only a function, not as a subroutine, or do not support the (optional) Status argument."
因此,两个问题:
- Rename Intrinsic(函数)有什么副作用?
- 如果需要便携性,哪种形式更适合使用?
首先请注意,您参考的手册非常古老。它属于 GCC 3,因此它对 g77
有效,对 gfortran
无效。最新版本在这里 https://gcc.gnu.org/onlinedocs/gfortran/RENAME.html
如果需要可移植性(从编译器到编译器),根本不要使用此过程,而是调用 OS 来实现。在不同的 OS 上会有所不同。例如,在 Linux
call EXECUTE_COMMAND_LINE('mv ' // trim(old) // ' ' // trim(new) )
或 SYSTEM()
而不是 EXECUTE_COMMAND_LINE()
在较旧的编译器上。
副作用是文件重命名本身。正常的内在函数是纯粹的,它们将(大部分)return 相同输入的相同答案,并且它们不会改变任何外部状态。副作用是除了 return 函数 return 值之外改变某些外部状态的任何操作。
注意子程序形式也有同样的副作用。但这不是问题。子程序预计会有副作用。
这与RANDOM_NUMBER()
是子程序的原因相同。它具有改变随机生成器状态的副作用。非标准函数 RAND()
很难看,因为它是一个有副作用的函数。
GNU fortran 手册部分“10.5.2.126 Rename Intrinsic (function)”说 "Due to the side effects performed by this intrinsic, the function form is not recommended."
另一方面,“8.11.9.213 Rename Intrinsic (subroutine)”部分说 "Some non-GNU implementations of Fortran provide this intrinsic as only a function, not as a subroutine, or do not support the (optional) Status argument."
因此,两个问题:
- Rename Intrinsic(函数)有什么副作用?
- 如果需要便携性,哪种形式更适合使用?
首先请注意,您参考的手册非常古老。它属于 GCC 3,因此它对 g77
有效,对 gfortran
无效。最新版本在这里 https://gcc.gnu.org/onlinedocs/gfortran/RENAME.html
如果需要可移植性(从编译器到编译器),根本不要使用此过程,而是调用 OS 来实现。在不同的 OS 上会有所不同。例如,在 Linux
call EXECUTE_COMMAND_LINE('mv ' // trim(old) // ' ' // trim(new) )
或 SYSTEM()
而不是 EXECUTE_COMMAND_LINE()
在较旧的编译器上。
副作用是文件重命名本身。正常的内在函数是纯粹的,它们将(大部分)return 相同输入的相同答案,并且它们不会改变任何外部状态。副作用是除了 return 函数 return 值之外改变某些外部状态的任何操作。
注意子程序形式也有同样的副作用。但这不是问题。子程序预计会有副作用。
这与RANDOM_NUMBER()
是子程序的原因相同。它具有改变随机生成器状态的副作用。非标准函数 RAND()
很难看,因为它是一个有副作用的函数。