我写了一个简单的函数来返回一个字符串让我在屏幕上显示。
static std::string myFun(int myId){
std::ostringstream stream;
int myStatus;
if(get_status(&myStatus)) stream << get_error();
else{
stream << "my status:" << myStatus;
}
return stream.str();
}
代码本身可能并不重要。但我把它包含在以防万一。我遇到的问题是因为在我最初的尝试中,我忘了包含return语句
return stream.str();
编译器编译时没有错误,但是当我运行它时。该程序不断收到像
这样的消息Aborted(core dumped)
我吓坏了,我搜索了stackoverflow并安装了valgrind和所有东西。然后我检查代码,我意识到我只是忘记包含return语句!我希望编译器能够注意到这些错误。
有人可以向我解释为什么编译器无法检测到错误吗?
答案 0 :(得分:7)
在非return
函数的所有控制路径上没有void
值的代码行为是 undefined 。 (C ++有很多未定义的构造;可能是对开发人员有利于最大性能和可移植性的结果。)
一个好的编译器会警告你这一点,甚至会提供设置来将警告(以及其他警告)升级为错误。请参阅编译器文档。
答案 1 :(得分:2)
因为,在一般情况下,编译器无法证明您的函数没有返回。如果它总是抛出异常会发生异常,但该异常来自另一个翻译单元中定义的函数,例如链接库?
因此语言标准不能要求编译器出错;因此,他们不会打扰。
但是,在这样的简单示例中,编译器可以告诉,并且当它可以时,它会警告您。如果你打开警告。你现在该做什么。
但最终,在C ++中,发现这种事情是程序员的责任。如果您的视力不足,静态分析工具可以帮助您避免此类错误。 :)