c++ - 来自宏的警告

标签 c++ c gcc macros g++

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__[0, 2] 1

warning: missing whitespace after the macro name [enabled by default]

我正在尝试编译第三方头文件,但 gcc 抛出此警告。 我不确定这个宏的作用。它是定义以下内容的快捷方式吗?如何修复警告?

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__0 1
#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__1 1
#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__2 1

最佳答案

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__[0, 2] 1

在 C89/C90 中,这是一个有效的宏定义,但是 [] 字符没有什么特别之处。它定义了一个名为 DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__ 的类对象宏,定义等同于:

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__ [ 0 , 2] 1

因此 DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__ 的任何使用都扩展为 [0, 2] 1。 (这甚至不太可能有意义;C 不允许在 [...] 中使用多个索引表达式,并且 0, 2 将被解释为逗号表达式等同于 2。)

C99 添加了一条新规则 (6.10.3p3):

There shall be white-space between the identifier and the replacement list in the definition of an object-like macro.

这使得上述定义无效(约束违规 需要诊断)。在宏名后加一个空格:

#define DF__TCDX0_RB_INFO__BRANCH_INDEX_LIST__ [0, 2] 1

会使警告静音,但这不太可能是正确的解决方法。

看起来的目的是允许使用宏来将[] 用于某些特殊目的,但这不是什么标准语言支持。它可能是特定于编译器的扩展,但我从未遇到过,我可能不建议使用它。

查看一些引用宏的代码可能会有用。

关于c++ - 来自宏的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20523772/

相关文章:

c++ - 在类中定义变量

c - gcc、严格别名和通过 union 转换

c++ - 如何在 C 或 C++ 的 O(n) 中删除数组中的重复元素?

c - 预期的主要错误总是出现在 c 中

c - 如何编写分配完整数据结构的函数

c - 如何在 OS X 10.10.1 上正确安装 cs50.h 库?

Linux 如何跟踪配置脚本检查了哪些依赖项

c++ - 在 OpenGL 4.0 中绘制球体

c++ - 如何覆盖STL容器函数

c++ - 将指针传递给派生类,传递给需要指向基类的指针的函数?