如何沉默'最后一句话应该返回一个值'警告?

时间:2011-04-12 15:16:35

标签: c++ sunstudio

Sun Studio 12.1打印警告

Warning: The last statement should return a value.

经常用于这样的功能:

int f()
{
  /* some code that may return */

  // if we end up here, something is broken
  throw std::runtime_error("Error ...");
}

很明显,我们在函数末尾不需要返回值。我犹豫插入像

这样的东西
// Silence a compiler warning
return 42;

在这样的函数结束时,因为它无论如何都是死代码。对于更复杂的返回类型,实际上可能难以构造“合理的”虚假值。

沉默这种警告的推荐方法是什么?

5 个答案:

答案 0 :(得分:4)

你能以这种方式重新组织函数中的代码(希望更合乎逻辑),正常路径发生在函数的末尾,这样就可以使用返回,并且异常路径更早发生,而不是最后一句话?

编辑:如果重新组织函数真的没有意义,你总是可以放一个带注释的虚拟return 0;。最好是以更全面的方式压制警告。

如果你真的想永久安静警告,你可以使用#pragma error_messages (off, wnoretvalue),但请注意警告在大多数情况下确实很有用,所以我绝对不建议将其关闭。您可以使用pragma的on版本在函数后重新启用警告,但如果您的函数被内联,编译器仍会发出警告。如果你把函数放在它自己的源文件中并使用pragma,它应该相对安全地发出警告,因为它不会影响其他翻译单元。

另一个非常古怪的可能性是切换到g ++。除非您正在为SPARC编译,否则g ++实际上可能会产生比Sun工作室更好的代码。

答案 1 :(得分:3)

我发现它是abort()的最佳位置。根据你的说法,你永远不应该在那里结束,所以像这样:

UNREACHABLE("message")

扩展为:

#ifdef NDEBUG
  #define UNREACHABLE(Message_) abort();
#else
  #define UNREACHABLE(Message_) assert(0 && Message_);
#endif

看起来合适

答案 2 :(得分:2)

既然你知道将系统地调用异常,为什么不简单地返回0?

答案 3 :(得分:1)

也许将内容封装在do { } while (false);构造中:

int my_function()
{
  int result = DEFAULT_VALUE;
  do
  {
     result = /*...*/
     // Whatever
     if (error)
     {
       throw std::runtime_error("Error ...");
     }
   } while (false);
   return result;
}

想法是正常操作设置结果值然后让执行流程结束或使用break跳转到return语句。

答案 4 :(得分:0)

我不知道采用“推荐”的方式处理它,但要回答关于应对更复杂类型的问题,那么:

ComplexType foo()
{
    ...
    throw std::runtime( "Error..." );
    return *(ComplexType*)(0);
}

这将适用于任何返回类型。我意识到它看起来很邪恶,但它只是为了使警告沉默。正如你所说,这段代码永远不会被执行,甚至可能会被优化掉。