我遇到了以下问题:
我有以下两个正确的工作宏(扩展到 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) 处的表达式中应有右括号
即根本不执行连接。