![]() |
1
20
这是为了支持与C的向后兼容性,C并不严格要求从所有函数返回。在这些情况下,返回位置(堆栈或寄存器)只剩下最后一个值。 如果这是在没有警告的情况下编译的,尽管您可能没有将错误级别设置得足够高。大多数编译器现在都会对此发出警告。 |
![]() |
2
5
将警告级别设置为4并尝试。并非所有控制路径都返回一个值,即我记得收到此警告的警告。 |
![]() |
3
5
可以编写保证始终返回值的代码,但编译器可能无法理解这一点。一个简单的例子是:
就编译器而言,可能所有3个
是的,一个更聪明的编译器可能能够解决这个问题,但是想象一下,在整数比较中,我们调用了在单独的翻译单元中定义的外部函数。然后,作为人类,我们可以证明所有的控制路径都返回值,但是编译器肯定无法理解这一点。 允许这样做的原因是为了与C兼容,而C允许这样做的原因是为了与C标准化(pre-ansi)之前编写的遗留C代码兼容。有一些代码确实做到了这一点,所以为了让这些代码保持有效和无错误,C标准允许这样做。尽管如此,让控件从函数中脱离而不返回值仍然是未定义的行为。
任何一个合适的编译器都应该对此提供警告;根据您的编译器,您可能必须将警告级别提高一点。我认为GCC的警告选项是
|
![]() |
4
0
可能您的特定编译器没有像它应该做的那样做良好的流控制分析。 您使用的编译器版本是什么?您使用什么开关进行编译? |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |