【问题标题】:Concatenate strings in a macro using gfortran使用 gfortran 在宏中连接字符串
【发布时间】:2016-09-24 18:34:08
【问题描述】:

用于连接的 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

gfortran 在 MAC 上的编译错误

gfortran m.F90 -o m
m.F90:5.23:
integer, parameter:: ID##2 = 3
                       1
Error: PARAMETER at (1) is missing an initializer

【问题讨论】:

  • 通常的策略是先把文件传给预处理器,再编译预处理后的文件:stackoverflow.com/questions/38953392/…
  • gfortran 设置了 tradcpp (gcc -E -traditional) 以避免 c99 // cmets 和 Fortran 连接之间的冲突。如前所述,一个典型的替代方案是显式使用不同的预处理器,例如通过 Makefile。

标签: macos macros fortran c-preprocessor gfortran


【解决方案1】:

## 在 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

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

【讨论】:

  • 感谢您把我送到这里,@VladimirF。我正在查看您的第二个代码示例,代码的非 gfortran 部分不应该是 #define PASTE(a,b) a ## b 吗?如,将b 作为参数添加到PASTE 的定义中?
猜你喜欢
  • 2013-07-10
  • 1970-01-01
  • 2010-12-16
  • 2018-11-29
  • 1970-01-01
  • 2017-10-03
  • 2017-08-27
  • 2011-07-12
相关资源
最近更新 更多