我认为这是不可能的,但我还是要问。
给定如下的 x-macro:
#define X_TABLE(_)\
_(1, a, "hi")\
_(2, b, "hello")\
_(3, c, "sup")
// ...
#define X(_1, _2, _3) SomeFunc(_1, _2, _3);
X_TABLE(X)
#undef X
上述内容将生成:
SomeFunc(1, a, "hi");
SomeFunc(2, b, "hello");
SomeFunc(3, c, "sup");
X_TABLE
有没有办法在的评估中跳过某些行X
,使得SomeFunc
不会为该行生成?
也许,生成类似这样的内容:
SomeFunc(1, a, "hi");
SomeFunc(3, c, "sup");
免责声明:
X 宏是 C 编程中引入的一种古老技术。
由于宏与命名空间和作用域无关,它们可能会在 C++ 中造成一些奇怪且意想不到的效果。(在 C 语言中,由于没有类和命名空间,因此不存在这个问题。)
尽管如此,(至少在 C++20 之前)有些用例仍然无法通过宏以外的任何其他方式覆盖 - 即基于字符串化运算符的技术。
条件X宏:
关于OP在X宏中对行的条件使用,可以采用以下解决方案:引入一个或多个带有条件的附加列。这些附加列用于(与标记粘贴结合使用)构建宏名称。因此,某些行可以(或不能)扩展为与其他行不同的文本。
举个例子来说明这一点:
输出:
coliru 上的演示
较新版本的 C++ 和 C 标准支持
__VA_OPT__
。您可以使用它将第四个 pp-token 引入到列表中,从而实现一些特殊行为:预处理: