代码示例:
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));
^~~~~~~~~~~~~
在不引发警告的情况下使用此方法的正确方法是什么?
答案 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文档没有提及此要求...