如何在 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 工作,但我试过的都没有用!一些评论有人建议为了使它起作用必须添加 -C
到
gcc
个参数(意味着注释将传递给 cc1
)。当然 gcc 7 文档没有提到任何关于此要求的内容...
代码示例:
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 工作,但我试过的都没有用!一些评论有人建议为了使它起作用必须添加 -C
到
gcc
个参数(意味着注释将传递给 cc1
)。当然 gcc 7 文档没有提到任何关于此要求的内容...