我一直在玩[[noreturn]]属性,我正在尝试处理和使用它(我知道[[noreturn]]
是C++11标准属性,__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.
我觉得它会回来的!这是怎么回事这是编译器错误吗?
如果从A中删除"=1",则它编译良好,不会发出警告。
如果我确实使foo()函数成为[[noreturn]] void foo()
,那么它确实会因分段错误而崩溃。
好的,很抱歉删除最后一个答案。这是错误的。好的,noreturn意味着函数永远不会结束。分段犯规是因为bar不是变量
只是为了跟进一个老问题:clang
是正确的,即使有点迂腐。
事实上,属性noreturn
适用于foo()
函数,因为它不返回任何内容。事实上,2016年的clang
与枚举中的微小变化相混淆,这是一个问题。
但我们应该原谅clang
的这种pecadillo,因为C++11语法不是可以称之为非常简单的语法。