带有C / C ++样式宏的Fortran 90(例如#define SUBNAME(x)s ## x)

时间:2012-06-02 21:25:17

标签: macros preprocessor fortran90 gfortran

我最近正在使用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 ++样式)。每组用于定义数据类型(例如,真实(4),真实(8),字符等)。文件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:

中      

子程序## loct_pointer_copy_1(o,i)                1错误:(1)

中SUBROUTINE语句中的语法错误

似乎gfortran用s ## loct_pointer_copy_1(o,i)替换SUBNAME(loct_pointer_copy_1)(o,i)。但根据c ++宏,正确的替换应该是sloct_pointer_copy_1(o,i)。

有人能告诉我为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

GNU Fortran在传统模式中使用GNU C预处理器,在这种模式下,宏粘贴运算符##不可用。这就是为什么写入的Fortran项目也使用GNU工具链进行编译,在其他Makefile目标中执行显式预处理的原因,例如:所有*.F90首先使用cpp预处理到临时.f90文件,然后进行编译。