c++ - 类似函数的宏扩展为空

标签 c++ c c-preprocessor

这是一个很奇怪的问题。这是一个非常简单的类似函数的宏,我已经多次看到它的例子。我什至以前用过它!但是,我在 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/

相关文章:

c - 如何创建一个儿子来执行键盘读取的程序

使用 C 计算稀疏矩阵每列的总和

java - 使用java解析标记化的c代码

c - 重用/递增 C 宏定义?

gcc - 为什么 GCC 将看似不需要的变量插入到我的程序集文件中?

c++ - 从 RegQueryValueEx 获取正确的值

c++ - 作为集成商,如何根据症状避免重复出现的代码错误?

c++ - freeglut 中的 glutidlefunc() 有什么意义

Objective-C:前向类声明

c++ - 使用括号括起来的初始化器分配字符串时出错