使用 gfortran 连接宏中的字符串
Concatenate strings in a macro using gfortran
用于串联的 C 预处理器宏 (##
) 似乎不适用于使用 gfortran 的 Mac。在其他系统上使用其他 Fortran 编译器是可行的,所以我正在寻找 gfortran 的解决方法。我必须使用 ##
来创建许多变量,所以我离不开它们。
示例代码:
#define CONCAT(x,y) x##y
program main
integer, parameter:: CONCAT(ID,2) = 3
print*,"Hello", ID_2
end program main
MAC
上的 gfortran 编译错误
gfortran m.F90 -o m
m.F90:5.23:
integer, parameter:: ID##2 = 3
1
Error: PARAMETER at (1) is missing an initializer
##
在 gfortran 中不起作用(任何 OS,而不仅仅是 Mac),因为它在 传统模式 中运行 CPP .
根据this thread the gfortran mailing list传统模式下正确的运算符是x/**/y
,所以一定要区分不同的编译器:
#ifdef __GFORTRAN__
#define CONCAT(x,y) x/**/y
#else
#define CONCAT(x,y) x ## y
#endif
其他(http://c-faq.com/cpp/oldpaste.html) use this form, which behaves better when a macro passed to the CONCAT (via ):
#ifdef __GFORTRAN__
#define PASTE(a) a
#define CONCAT(a,b) PASTE(a)b
#else
#define PASTE(a) a ## b
#define CONCAT(a,b) PASTE(a,b)
#endif
间接公式有助于在字符串连接之前扩展传递的宏(之后为时已晚)。
用于串联的 C 预处理器宏 (##
) 似乎不适用于使用 gfortran 的 Mac。在其他系统上使用其他 Fortran 编译器是可行的,所以我正在寻找 gfortran 的解决方法。我必须使用 ##
来创建许多变量,所以我离不开它们。
示例代码:
#define CONCAT(x,y) x##y
program main
integer, parameter:: CONCAT(ID,2) = 3
print*,"Hello", ID_2
end program main
MAC
上的 gfortran 编译错误gfortran m.F90 -o m
m.F90:5.23:
integer, parameter:: ID##2 = 3
1
Error: PARAMETER at (1) is missing an initializer
##
在 gfortran 中不起作用(任何 OS,而不仅仅是 Mac),因为它在 传统模式 中运行 CPP .
根据this thread the gfortran mailing list传统模式下正确的运算符是x/**/y
,所以一定要区分不同的编译器:
#ifdef __GFORTRAN__
#define CONCAT(x,y) x/**/y
#else
#define CONCAT(x,y) x ## y
#endif
其他(http://c-faq.com/cpp/oldpaste.html) use this form, which behaves better when a macro passed to the CONCAT (via
#ifdef __GFORTRAN__
#define PASTE(a) a
#define CONCAT(a,b) PASTE(a)b
#else
#define PASTE(a) a ## b
#define CONCAT(a,b) PASTE(a,b)
#endif
间接公式有助于在字符串连接之前扩展传递的宏(之后为时已晚)。