重命名()内在函数的副作用?

时间:2016-02-03 08:41:48

标签: fortran side-effects

GNU fortran手册部分“10.5.2.126 Rename Intrinsic (function)”说“由于此内在函数执行的副作用,建议不要使用函数表单。”

另一方面,“8.11.9.213 Rename Intrinsic (subroutine)”说“Fortran的一些非GNU实现仅将此内在函数作为一个函数提供,而不是作为子例程,或者不支持(可选)Status参数。”

因此,有两个问题:

  1. Rename Intrinsic(function)有什么副作用?
  2. 如果需要便携性,最好使用哪种形式?

1 个答案:

答案 0 :(得分:3)

首先请注意您引用的手册非常陈旧。它是GCC 3,因此它对g77而不是gfortran有效。最近的版本在https://gcc.gnu.org/onlinedocs/gfortran/RENAME.html

如果需要可移植性(从编译器到编译器),根本不要使用此过程,而是调用操作系统来执行此操作。在不同的操作系统上会有所不同。例如,在Linux上

call EXECUTE_COMMAND_LINE('mv ' // trim(old) // ' ' // trim(new) )

SYSTEM()代替旧版编译器上的EXECUTE_COMMAND_LINE()

副作用是文件重命名本身的动作。正常的内在函数是纯粹的,它们(大多数)会为相同的输入返回相同的答案,并且它们不会改变任何外部状态。副作用是除了返回函数返回值之外还会更改某些外部状态的任何操作。

请注意,子程序表单也具有相同的副作用。但这不是问题。子程序预计会产生副作用。

这与RANDOM_NUMBER()是子例程的原因相同。它具有改变随机发生器状态的副作用。非标准函数RAND()很难看,因为它是一个带副作用的函数。