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

时间:2017-07-27 11:08:52

标签: c gcc switch-statement fall-through

代码示例:

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));
   ^~~~~~~~~~~~~

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

2 个答案:

答案 0 :(得分:6)

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

应用于您的代码示例:

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

    case 1:
        break;
    }

    return 0;
}

答案 1 :(得分:2)

曾尝试发表评论,但没有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文档没有提及此要求...