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
选项编译
我想在一个简单的 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
选项编译