如何使警告'The last statement should return a value'静音?

How to silence 'The last statement should return a value' warning?

本文关键字:return value should 静音 last 何使 警告 The statement      更新时间:2023-10-16

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;
在这样的函数末尾使用

,因为它是死代码。对于更复杂的返回类型,实际上可能很难构造一个"合理的"伪值。

建议用什么方法来消除这样的警告?

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

编辑:如果重新组织函数真的没有意义,你可以总是放一个假的return 0;和注释。以这种方式压制警告比更全局的方式要好。

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

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

我发现它是abort()的完美地点。你不应该在这里结束,根据你,所以像这样:

UNREACHABLE("message")

展开为:

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

看起来合适的

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

可以将内容封装在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语句。

我不知道有什么"推荐"的方法来处理它,但是为了回答你关于处理更复杂类型的问题,如何:

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

这将适用于任何返回类型。我知道它看起来很邪恶,但它只是为了平息警告。就像你说的,这段代码永远不会被执行,它甚至可能被优化掉。