0

我遇到了以下问题:

我有以下两个正确的工作宏(扩展到 Fortran90 代码):

#define ld_dx(A)   (  (A(ixp1)-A(ix  ))/(dx)  )
#define rd_dx(A)   (  (A(ix  )-A(ixm1))/(dx)  )

(注意:这些宏依赖于以下附加宏:

#define ix    2:nx-1
#define ixp1  1+ix+1
#define ixm1 -1+ix-1

它们还取决于声明:

integer, parameter :: nx = 100, dx = 1

)

在我的代码中,我可以通过调用来使用这些宏,例如

X = X + ld_dx(Y)

或者:

X = X + rd_dx(Y)

现在我希望能够通过编写 d_dx(A,l) 来调用 ld_dx(A),并通过编写 d_dx(A,r) 来调用 rd_dx(A)。因此,该示例将如下所示:

X = X + d_dx(Y,l)

或者

X = X + d_dx(Y,r)

=> 我正在寻找可以提供这种语法糖的 CPP 宏(以尽可能接近数学符号)。<=

最直接的做法是:

#define d_dx(A,s)  s ## d_dx(A)

不幸的是,这不起作用。CPP 转换

d_dx(Y,l)

进入:

l ## Y)

我通过研究其他与 CPP 连接相关的问题尝试了很多事情,但我无法弄清楚。非常感谢您的帮助!

山姆

PS:请注意,我也可以将宏“ld_dx(A)”和“rd_dx(A)”重命名为“dl_dx(A)”和“dr_dx(A)”,这是最直接的事情将会:

#define d_dx(A,s)  d ## s ## _dx(A)

不幸的是,这也不起作用:CPP 转换

d_dx(Y,l)

进入:

d ## l ## _dx(Y) 
  1

错误:在 (1) 处的表达式中应有右括号

即根本不执行连接。

4

2 回答 2

2
#define PASTE(x,y) x##y
#define d_dx(A,s) PASTE(s,d_dx)(A)

标记粘贴(## 运算符)和字符串化(# 运算符)抑制相邻参数的替换,因此您必须分两步完成。

于 2012-04-13T11:52:53.980 回答
0

尝试不带空格。一些预处理器会忽略 ## 两侧的空格,而另一些则不会。

#define d_dx(A,s)  d##s##_dx(A)
于 2012-04-15T07:23:25.123 回答