3

我一直在玩 [[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(),那么它确实会因分段错误而崩溃。

4

2 回答 2

-1

好的抱歉删除最后一个答案。那是错的。好的 noreturn 意味着函数永远不会结束。并且分段犯规是因为 bar 不是变量

于 2016-04-01T01:55:24.547 回答
-2

只是为了跟进一个老问题:clang是正确的,即使有点迂腐。

实际上,该属性noreturn适用于您的foo()函数,因为它不返回任何内容。2016 年的事实clang与枚举的细微变化相混淆,这是一个问题。

但是我们应该原谅clang这个pecadillo,因为 C++11 的语法并不是很简单。

于 2019-01-14T14:40:10.473 回答