3

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;

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

消除这种警告的推荐方法是什么?

4

5 回答 5

4

您能否以这样一种方式(希望也更合乎逻辑)重新组织函数中的代码,使正常路径发生在函数末尾,以便可以使用返回,而异常路径更早发生,而不是作为最后一条语句?

编辑:如果重新组织函数真的没有意义,你总是可以放一个return 0;带有评论的假人。以这种方式压制警告比在全球范围内压制警告要好。

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

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

于 2011-04-12T15:21:12.957 回答
3

我发现它是一个完美的地方abort()。根据您的说法,您永远不应该到此为止,例如:

UNREACHABLE("message")

扩展为:

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

看起来合适

于 2011-04-12T15:24:17.153 回答
2

既然你知道异常会被系统调用,那你为什么不直接返回一个 0 呢?

于 2011-04-12T15:20:42.317 回答
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;
}

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

于 2011-04-12T16:37:52.217 回答
0

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

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

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

于 2011-04-12T15:39:46.493 回答