如何使警告'The last statement should return a value'静音?
How to silence 'The last statement should return a value' warning?
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);
}
这将适用于任何返回类型。我知道它看起来很邪恶,但它只是为了平息警告。就像你说的,这段代码永远不会被执行,它甚至可能被优化掉。
- 方法错误"not all control paths return a value"和方法不返回值
- 如何解决类成员函数中的"return a value"错误?
- QThread start() return value
- 警告:"Not all control paths return a value" c++
- What value should `std::stringstream::fail()` return after r
- Return value of std::hash ofr (x86/x64)
- 在这个程序中"getavg must return value"意味着什么?
- OpenCV HOGDescriptor return value
- 虚假"<function> is expected to return a value"警告?
- Opencv cv::waitKey() return value
- 我返回一个值,但编译器告诉我"function must return a value"
- const object&return value from a method, best practice
- 循环函数给出"return’ with a value, in function returning void"误差
- Return-value C++
- 计算距离:方法"must return a value" ?
- c++ rapidjson return value
- CAsyncSocket receive() return value
- boost program_options add_options return value
- 如何在java中执行"an exe with return value"?
- return value-C++:由私有方法返回的本地typedef