[dcl.attr.noreturn]提供以下示例:
[[ noreturn ]] void f() {
throw "error";
// OK
}
Run Code Online (Sandbox Code Playgroud)
但我不明白有什么意义[[noreturn]],因为函数的返回类型已经存在void.
那么,该noreturn属性的重点是什么?它应该如何使用?
较新版本的gcc提供了Wimplicit-fallthrough,这对于大多数switch语句都很有用.但是,我有一个switch语句,我希望允许所有case语句的掉头.
有没有办法明确地通过?我宁愿避免Wno-implicit-fallthrough为这个文件编译.
编辑:我正在寻找一种方法来通过显式(如果可能)使下降,而不是通过编译器开关或编译指示关闭警告.
代码示例:
int main(int argc, char **argv)
{
switch(argc)
{
case 0:
argc = 5;
__attribute__((fallthrough));
case 1:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
仅使用gcc 6.3.0,-std=c11此代码给出警告:
<source>: In function 'main':
7 : <source>:7:3: warning: empty declaration
__attribute__((fallthrough));
^~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
在不引起警告的情况下使用此方法的正确方法是什么?
在GCC 7上,我已在Qt creator 4.9上启用了大多数警告。现在,我有一个switch语句,它涵盖了所有枚举值。如果添加,default:我会收到警告(来自Qt创建者):
warning: default label in switch which covers all enumeration values
Run Code Online (Sandbox Code Playgroud)
如果我删除,default:则会收到另一个警告(来自GCC):
error: this statement may fall through [-Werror=implicit-fallthrough=]
}
^
error: all warnings being treated as errors
Run Code Online (Sandbox Code Playgroud)
我应该做些什么?关闭警告?它们很有用,我不想关闭它们中的任何一个,但是Wimplicit-fallthrough似乎有问题。
[[fallthrough]]无济于事,因为cases以a结尾return(从Qt创建者那里):
warning: fallthrough annotation in unreachable code
Run Code Online (Sandbox Code Playgroud)
__attribute__ ((fallthrough))也没做任何事 /* FALLTHRU */或[[gnu::fallthrough]]或都没有// fall through。大概是因为-pedantic?
例:
enum class E {a, b, c};
QVariant fun(E e) {
switch (e) {
case …Run Code Online (Sandbox Code Playgroud) gcc ×3
c ×2
c++ ×2
attributes ×1
c++11 ×1
c99 ×1
fall-through ×1
gcc-warning ×1
noreturn ×1
qt-creator ×1