如何在 gcc 中正确使用 __attribute__((fallthrough))

How to use __attribute__((fallthrough)) correctly in gcc

代码示例:

int main(int argc, char **argv)
{
    switch(argc)
    {
    case 0:
        argc = 5;
        __attribute__((fallthrough));

    case 1:
        break;
    }
}

Using gcc 6.3.0,只有-std=c11,这段代码给出警告:

<source>: In function 'main':
7 : <source>:7:3: warning: empty declaration
   __attribute__((fallthrough));
   ^~~~~~~~~~~~~

在不引发警告的情况下使用它的正确方法是什么?

如前所述,__attribute__ ((fallthrough)) 是在 GCC 7 中引入的。 为了保持向后兼容性并清除 Clang 和 GCC 的 fall through 警告,您可以使用 /* fall through */ .

应用于您的代码示例:

int main(int argc, char **argv)
{
    switch(argc)
    {
    case 0:
        argc = 5;
        /* fall through */

    case 1:
        break;
    }

    return 0;
}

之前尝试过评论,但没有达到 50 声望。

所以,我的经历:

1) 该功能是从 gcc 7 开始的,所以在旧版本上使用 attribute 编译器会给出警告。因此我目前使用:

#if defined(__GNUC__) && __GNUC__ >= 7
 #define FALL_THROUGH __attribute__ ((fallthrough))
#else
 #define FALL_THROUGH ((void)0)
#endif /* __GNUC__ >= 7 */

然后我在代码

中使用FALL_THROUGH;

(总有一天我会弄清楚 clang 需要什么,但不是今天)

2) 我花了相当多的时间来尝试让 gcc marker comment 工作,但我试过的都没有用!一些评论有人建议为了使它起作用必须添加 -Cgcc 个参数(意味着注释将传递给 cc1)。当然 gcc 7 文档没有提到任何关于此要求的内容...