我希望有一个像这样工作的宏
int a = 20;
int b = 21;
EXPAND(a == b); // prints 20 == 21
这在c++中是可能的吗?
我能想到的唯一方法就是使用这样的宏:
EQUALS(a, b);
在这种情况下,很容易用变量的值组成字符串,但我想知道如何用逗号
代替==在预处理器中没有任何东西允许您将令牌序列a == b
切割为通用标识符a
和b
的单独令牌序列,即使您限制自己使用这种形式。
如果您将自己限制为一组选定的标识符,您可以使用##
令牌连接操作符并重新扫描扩展的宏来实现它,但这可能不是您想要的。
在语言层面上,你可以做一些技巧,例如,你可以利用运算符优先级和/或结合性来扩展宏,这样==
实际上不会在a
和b
之间求值,例如
#define EXPAND(expr) (MyClass{} < expr).eval();
现在,如果展开a == b
,那么实际上您将得到表达式(MyClass{} < a) == b
。然后,MyClass{}
可以重载所有比较操作符,并在内部重建实际表达式,然后在eval
成员函数中求值/输出。
此方法不适用于嵌套表达式中的变量名或在test周围有括号的情况。
这似乎也是例如Catch2所做的,但我猜还有其他不太有用的技巧。
然而,我建议简单地摆脱宏并将其替换为简单的函数调用,如printEquals(a, b);
。作为函数模板来实现要简单得多,而且不需要使用宏。