C 编译器 - 被遗忘的返回语句
C++ compiler - forgotten return statement
我写了一个简单的功能,以返回一个字符串供我显示在屏幕上。
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 stream.str();
编译器编译没有错误,但是当我运行时。该程序不断收到
之类的消息Aborted(core dumped)
我吓坏了,我搜索我堆叠并安装了Valgrind等。然后我检查代码,我意识到我只是忘记包括返回语句!我希望编译器会注意到这类错误。
有人可以向我解释编译器为什么无法检测到错误?
在非void
函数的所有控制路径上没有return
值的代码行为是 nest 。(C 具有大量未定义的结构;也许是由于最大程度地表现性能和可移植性而不是对开发人员的仁慈。(
一个好的编译器会警告您,甚至会为您提供设置,以将警告(以及其他(升级为错误。咨询您的编译器文档。
,因为在一般情况下,编译器不可能证明您的函数不会返回。相反,如果它总是引发异常,但是该异常来自另一个翻译单元中定义的函数,例如链接的库?
因此,语言标准不能要求编译器出错。因此,他们不会打扰。
然而,在这样的简单示例中,编译器 can 都会告诉您,它会警告您。如果您打开警告。您现在应该做。
最终,在C 中,发现这种事情是程序员的责任。如果您发现视力不足,静态分析工具可以帮助您避免此类错误。:(
相关文章:
- 返回语句后的代码,没有警告
- 三元运算符在返回语句中给出意外的结果
- 返回非 void 的函数中没有返回语句警告
- 如何使用单个返回语句返回对变量的引用
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 获取上次执行的返回语句的行
- 返回语句中矢量初始化时出现编译错误
- 快速搜索链表未编译,需要返回语句
- 静态成员函数赋值而不带返回语句
- 在返回语句中构造对象时,std::move() 是否有助于或阻止 RVO?
- 为什么返回语句和打印语句返回不同的答案?
- C++ 非 void 函数的崩溃没有返回语句
- 在返回语句中嵌套条件运算符
- 为什么结构化绑定禁用RVO和移动返回语句
- C - 程序返回值而无需返回语句
- 返回语句中的构造函数语法
- 编译器遇到返回语句时会做什么
- 是一个单一的返回语句清洁器
- C NRVO/复制Elision在括号中带有返回语句
- C 编译器 - 被遗忘的返回语句