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;
在这样的函数结束时,因为它无论如何都是死代码。对于更复杂的返回类型,实际上可能难以构造“合理的”虚假值。
沉默这种警告的推荐方法是什么?
答案 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);
}
这将适用于任何返回类型。我意识到它看起来很邪恶,但它只是为了使警告沉默。正如你所说,这段代码永远不会被执行,甚至可能会被优化掉。