7

代码示例:

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

    case 1:
        break;
    }
}

仅使用 gcc 6.3.0-std=c11此代码会发出警告:

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

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

4

2 回答 2

9

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

应用于您的代码示例:

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

    case 1:
        break;
    }

    return 0;
}
于 2018-02-09T09:26:06.173 回答
8

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

所以,我的经验:

1) 该功能是从 gcc 7 开始的,因此在旧编译器上使用属性会发出警告。因此我目前使用:

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

然后我FALL_THROUGH;在代码中使用

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

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

于 2018-10-28T10:48:37.463 回答