C预处理器宏:连接(Fortan90的示例)

时间:2012-04-13 11:23:24

标签: fortran concatenation c-preprocessor

我遇到了以下问题:

我有两个正确的工作宏(扩展到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宏(尽可能接近数学符号)。 &LT =

最直接的事情是:

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

中的右括号

即。串联根本就没有完成。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

尝试不用空格。有些预处理器会忽略##两侧的空格,有些则不会。

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