的Fortran 90与C / C ++式宏(例如#限定SUBNAME(X)■## x)的(Fort

2019-09-17 17:49发布

我最近与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:包括在基本/ loct.F90:256:

例程S ## loct_pointer_copy_1(O,i)的1错误:语法错误在SUBROUTINE语句在(1)

这似乎gfortran取代SUBNAME(loct_pointer_copy_1)(O,I)与S ## loct_pointer_copy_1(O,I)。 但根据C ++宏,正确的替换应该sloct_pointer_copy_1(O,I)。

谁能告诉我为什么会这样?

Answer 1:

GNU的Fortran采用GNU C预处理器在传统模式中 ,在所述模式中的宏粘贴操作者##将不可用。 这就是为什么它被写入也与GNU工具链编译的Fortran项目额外的Makefile目标进行明确的预处理,例如,所有的*.F90首先用预处理cpp临时.f90文件,这些文件进行编译。



文章来源: Fortran 90 with C/C++ style macro (e.g. # define SUBNAME(x) s ## x)