使用gfortran在宏中连接字符串

时间:2016-09-24 18:34:09

标签: macos macros fortran c-preprocessor 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

1 个答案:

答案 0 :(得分:4)

##在gfortran(任何操作系统,而不仅仅是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)使用此表单,当宏传递给CONCAT时(通过Concatenating an expanded macro and a word using the Fortran preprocessor),表现更好:

#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

间接公式有助于在连接字符串之前扩展传递的宏(之后为时已太晚)。