Fortran 为什么我需要在我使用函数的任何地方声明它的类型?

Fortran 为什么我需要在我使用函数的任何地方声明它的类型?,fortran,Fortran,考虑以下FORTRAN程序: program functiontest implicit none real :: x, square print *, "Enter a number to square" read (*,*) x print *, square(x) end program functiontest real function square(x) real :: x square = x * x end functi

考虑以下FORTRAN程序:

program functiontest
    implicit none
    real :: x, square
    print *, "Enter a number to square"
    read (*,*) x
    print *, square(x)
end program functiontest


real function square(x)
    real :: x
    square = x * x
end function square
为什么我需要在
程序功能测试
中声明
square
real
?我不是已经在它的定义中声明了它是一个实函数吗


FORTRAN的作者为什么做出这个设计决定?

不,实际上在您的示例中,您没有在程序内部声明它是一个真正的函数,但它是程序的一个外部函数。如果您在程序中定义了函数,如下所示,或者将其放入
模块中
使用它,则不必两次指定它为
实函数

program functiontest
    implicit none
    real :: x
    print *, "Enter a number to square"
    read (*,*) x
    print *, square(x)

contains
    real function square(x)
        real :: x
        square = x * x
    end function square
end program functiontest

至于为什么它也像您编写的那样工作,这是为了与Fortran 77向后兼容。

函数中的正方形是一个变量,而不是函数名。由于它是一个变量,因此必须使用正确的类型声明它。

将函数放入模块中并使用模块,如下所示。那么您就不需要在主程序中声明函数了

module foo
contains
real function square(x)
    real :: x
    square = x * x
end function square
end module foo

program functiontest
    use foo
    implicit none
    real :: x
    print *, "Enter a number to square"
    read (*,*) x
    print *, square(x)
end program functiontest

我认为您需要在functionlist中声明类型,因为“通常”编译器不知道“square”的类型。考虑一个案例,您在一个单独的文件中定义了函数“平方”,即“平方”f,并且在另一个文件“函数列表F”中列出了函数列表。在这种情况下,您需要分别编译这些文件,并创建两个对象文件,即square.o和functionlist.o。在这种情况下,编译器在编译“functionlist.o”时对“square”类型没有任何线索,除非您明确定义它

所以您可能会问,为什么编译器首先需要知道正方形的类型。我认为,答案与内存分配、类型转换有关(例如,当您将结果分配给实*8时)


注意,这在C.中也是常见的,你要么需要定义原型(在fo.h)中,其中声明方的类型,要么将所有函数放在文件中,这样编译器首先“看到”正方形。

也考虑函数和程序在单独的文件中并单独编译并仅链接的情况。在这种情况下,编译主程序时很难找出函数的返回类型(及其参数)