Fortran 如何强制编译器将省略的意图解释为意图(inout)

Fortran 如何强制编译器将省略的意图解释为意图(inout),fortran,Fortran,这个问题与以下问题有关:如何在子程序内部检测违反intent(in)。但我还没有在相关问题中找到答案 声明为intent(in)的变量可以由另一个忽略了intent声明的子程序/函数修改 例如: module test implicit none contains subroutine fun1(x) real(8), intent(in)::x call fun2(x) end subroutine subroutine fun2(x) real

这个问题与以下问题有关:如何在子程序内部检测违反
intent(in)
。但我还没有在相关问题中找到答案

声明为
intent(in)
的变量可以由另一个忽略了intent声明的子程序/函数修改

例如:

module test
  implicit none
  contains

  subroutine fun1(x)
    real(8), intent(in)::x
    call fun2(x)
  end subroutine

  subroutine fun2(x)
    real(8) :: x
    x = 10
  end subroutine
end module
gfortran和ifort可以编译此代码而不产生任何错误/警告。因此,我的问题是:

  • 是否可以禁止省略意图声明
  • 是否可以强制Fortran编译器将省略的意图解释为
    intent(inout)

  • 两个答案都是否定的。未指明的意图与所有其他意图根本不同。它与intent(inout)不同,因为可以将不可定义的表达式传递给具有未指定意图的子例程

    在许多情况下,根本不允许指定意图(过程参数、Fortran 95中的指针等)


    如果需要指定意图,可以将子例程定义为
    pure
    ,但它的作用远不止于此。但这对你来说可能是正确的。它禁止任何副作用。

    我认为由于自动定义的接口,您应该会出现编译错误。例如,如果维度错误,我也会有同样的想法(我将fun2伪参数x切换为z,我认为这更清楚地说明了我的观点)


    所以这意味着没有办法确保意图(in)不会因为非“纯”子例程而被违反?顺便说一句,谢谢您的“纯”提示。不幸的是,调用过程无法查看其他过程。它甚至可以看到它的接口,例如声明的意图。这个答案毫无意义。没有“自动定义接口”;更改伪参数的名称根本没有效果;它似乎混淆了种类和维度的概念。
    module test
      implicit none
      contains
    
      subroutine fun1(x)
        real(8), intent(in)::x
        call fun2(x)
      end subroutine
    
      subroutine fun2(z)
        real(3) :: z
        z = 10
      end subroutine
    end module