Macros Fortran 90与C/C++;样式宏(例如#定义子名称(x)s##x)

Macros Fortran 90与C/C++;样式宏(例如#定义子名称(x)s##x),macros,preprocessor,fortran90,gfortran,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.F9

我最近正在处理一个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-cloct.F90)时,我得到了一些错误

basic/loct_inc.F90:21.13: 包含在基本/位置F90:256:

子例程s##loct#u指针(u copy_1(o,i) 1错误:(1)处子程序语句中的语法错误

似乎gfortran将子名称(loct#u pointer_copy_1)(o,i)替换为s#loct#u pointer_copy_1(o,i)。但是根据C++宏,正确的替换应该是sLogtpPoTythIopix1(o,i).<
有人能告诉我为什么会发生这种情况吗?

GNU Fortran在传统模式下使用GNU C预处理器,在这种模式下,宏粘贴操作符
不可用。这就是为什么用GNU工具链编写的Fortran项目在其他生成文件目标中执行显式预处理,例如,所有
*.F90
首先用
cpp
预处理为临时
.F90
文件,然后再进行编译。

非常感谢Hristo。我将先预处理f90文件。我要找一会儿,看看能不能找到答案。