这是一个很奇怪的问题。这是一个非常简单的类似函数的宏,我已经多次看到它的例子。我什至以前用过它!但是,我在 6 小时后无法正常工作。我累了,决定在这里问。也许有人发现了问题。最小的可重现情况是:
enum e {
x, y, z,
#define Func(X, Y, Z) \
my_##X = Y
Func(x, y, z),
};
它是 used in clang源代码类似。我也包含一个包含宏的定义和使用的文件。编辑:
非常感谢您的回答和评论。我确实使用过 Godbolt,但是在我的构建失败之后。事实证明,宏在我的构建过程中从未失败过。那是因为我没用过宏!它没有被使用,所以它从来没有产生过输出。真是太丢人了。我必须接受我的错误,然后继续前进。我必须通过本地预处理来检查它。在 Godbolt 中得到空字符串让我相信我做错了什么。
最佳答案
显然(正如@Shawn 在评论中指出的那样)这是因为 Godbolt“未使用的标签”(“漏斗”过滤器图标)中的编译器输出被检查,并且如果您使用预处理器输出运行 -E
它将过滤掉未使用的东西。
您只需引用 my_x
即可解决此问题。在编译程序的某个地方,或者在查看预处理器输出时在 Godbolt 中取消选中“未使用的标签”。
作为旁注,请注意枚举末尾的“尾随逗号”是在 C99 中添加的,因此如果您使用较旧的 C90 编译器,您可能会因此遇到奇怪的编译器打嗝。
关于c++ - 类似函数的宏扩展为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64801706/