【发布时间】:2012-06-02 21:25:16
【问题描述】:
我最近正在处理一个 F90 代码项目。我正在使用 gfortran (linux 和 MinGW) 来编译它。 loct.F90 文件中有一些有趣的东西。
# define TYPE real(4)
# define SUBNAME(x) s ## x
# include "loct_inc.F90"
# undef SUBNAME
# undef TYPE
# define TYPE real(8)
# define SUBNAME(x) d ## x
# include "loct_inc.F90"
# undef SUBNAME
# undef TYPE
...
loct_inc.F90 文件如下所示:
subroutine SUBNAME(loct_pointer_copy_1)(o, i)
...
end subroutine SUBNAME(loct_pointer_copy_1)
subroutine SUBNAME(loct_pointer_copy_2)(o, i)
...
end subroutine SUBNAME(loct_pointer_copy_2)
...
我认为在文件 loct.F90 中作者使用了宏集(C/C++ 风格)。每个集合用于定义一种数据类型(例如 real(4)、real(8)、character 等)。 loct_inc.F90 文件提供了一组函数,除了变量的类型外,它们是相同的。 在我看来,这两个文件作为 c++ 的模板一起工作。
最后应该有一套子程序:
sloct_pointer_copy_1(o, i)
sloct_pointer_copy_2(o, i)
...
dloct_pointer_copy_1(o, i)
dloct_pointer_copy_2(o, i)
...
但是当我尝试编译 loct.F90 (gfortran -c loct.F90) 时,我得到了一些错误。
基本/loct_inc.F90:21.13: 包含在 basic/loct.F90:256:
subroutine s ## loct_pointer_copy_1(o, i) 1 错误: (1) 处的 SUBROUTINE 语句中的语法错误
似乎 gfortran 将 SUBNAME(loct_pointer_copy_1)(o, i) 替换为 s ## loct_pointer_copy_1(o, i)。但是根据c++宏,正确的替换应该是sloct_pointer_copy_1(o, i)。
谁能告诉我为什么会这样?
【问题讨论】:
标签: macros preprocessor fortran90 gfortran