Fortran 中的导出宏

Export macros in Fortran

我想在一个简单的 fortran 项目中模仿 C 代码,我会 #define 一些宏并在我的代码中使用它们。

例如,动物模块如下:

#define timestwo(x) (2 * (x))

module animal_module

    implicit none

    ! ...

    ! test
    procedure :: answer

    ! ...

    function answer(this) result(n)
        class(animal), intent(in) :: this
        integer :: n
        n = timestwo(42)
    end function answer
end module animal_module

如果我在模块中使用宏,如您所见,我没有任何错误并且工作正常。

但是,在主文件中使用该宏根本不起作用:

program oo

    use animal_module

    implicit none

    print *, 'the macro ', timestwo(5)

end program

编译器抱怨宏:

main.F90(21): error #6404: This name does not have a type, and must have an explicit type.   [TIMESTWO]
    print *, 'the macro ', timestwo(5)

我错过了什么?

使用预处理器宏时,效果是 该文件 中的简单文本替换。问题的源文件没有创建任何可以导出的模块实体,替换也没有向上传播 "use chains".

Fortran 与 C 的不同之处在于 use module#include "header.h" 不同:模块的源代码不包含在主程序文件中以进行文本替换。

如果你真的要使用这种方法,你应该在程序的源代码中重复宏定义。为了简化事情,您可以在预处理器包含文件中定义这个通用宏,然后 #include 它(不是 include):

#include "common_macros.fi"
program
...
end program

在你的模块文件中类似。

最好不要使用预处理器宏来实现 "simple functions"。模块中的真正功能是可导出实体。一个如此简单的纯函数很可能像宏一样容易地内联(使用适当的优化标志)。

这是一些在控制台应用程序中运行的示例代码

#define twice(x) (2*x)

program Console1
implicit none

print *, twice(7)
! 14

end program Console1

你需要用/fpp选项编译