如何定义一个宏,用自己的值替换变量的名称?



我希望有一个像这样工作的宏

int a = 20;
int b = 21;
EXPAND(a == b); // prints 20 == 21

这在c++中是可能的吗?

我能想到的唯一方法就是使用这样的宏:

EQUALS(a, b);

在这种情况下,很容易用变量的值组成字符串,但我想知道如何用逗号

代替==

在预处理器中没有任何东西允许您将令牌序列a == b切割为通用标识符ab的单独令牌序列,即使您限制自己使用这种形式。

如果您将自己限制为一组选定的标识符,您可以使用##令牌连接操作符并重新扫描扩展的宏来实现它,但这可能不是您想要的。


在语言层面上,你可以做一些技巧,例如,你可以利用运算符优先级和/或结合性来扩展宏,这样==实际上不会在ab之间求值,例如

#define EXPAND(expr) (MyClass{} < expr).eval();

现在,如果展开a == b,那么实际上您将得到表达式(MyClass{} < a) == b。然后,MyClass{}可以重载所有比较操作符,并在内部重建实际表达式,然后在eval成员函数中求值/输出。

此方法不适用于嵌套表达式中的变量名或在test周围有括号的情况。

这似乎也是例如Catch2所做的,但我猜还有其他不太有用的技巧。


然而,我建议简单地摆脱宏并将其替换为简单的函数调用,如printEquals(a, b);。作为函数模板来实现要简单得多,而且不需要使用宏。

相关内容

  • 没有找到相关文章

最新更新