我一直在玩[[noreturn]]属性,我试图掌握并使用它(我理解[[noreturn]]
是C++11 standard attribute __attribute__((noreturn))
是GCC / Clang扩展名。作为其中的一部分,我启用了Clang警告-Wmissing-noreturn。
> clang++ -v
Ubuntu clang version 3.7.1-svn253742-1~exp1 (branches/release_37) (based on LLVM 3.7.1)
Target: x86_64-pc-linux-gnu
Thread model: posix
Foo.cpp中:
enum bar
{
A = 1,
B,
C
};
void foo()
{
switch (bar())
{
case A:
case B:
case C:
default:
break;
}
}
int main()
{
foo();
return 0;
}
然后编译:
> clang++ foo.cpp -o foo -Wmissing-noreturn -std=c++14
foo.cpp:9:1: warning: function 'foo' could be declared with attribute 'noreturn'
[-Wmissing-noreturn]
{
^
1 warning generated.
在我看来它会回归!这里发生了什么?这是编译错误吗?
如果删除" = 1"从A开始,它会在没有警告的情况下编译好。
如果我确实创建了foo()函数[[noreturn]] void foo()
,那么它会因分段错误而崩溃。
答案 0 :(得分:-1)
很抱歉删除了最后一个答案。那是错的。好的noreturn意味着功能永远不会结束。并且分裂可能是因为bar不是变量
答案 1 :(得分:-1)
只需跟进一个老问题:clang
是正确的,即使有点学究。
实际上,属性noreturn
适用于您的foo()
函数,因为它不返回任何内容。 2016年的clang
与枚举的细微变化混淆,这是一个问题。
但是对于这个 pecadillo ,我们应该原谅clang
,因为C ++ 11语法并不是什么简单的语法。