我遇到了以下问题:
我有两个正确的工作宏(扩展到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)
中的右括号
即。串联根本就没有完成。
答案 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)