【发布时间】:2014-03-06 19:43:03
【问题描述】:
我很惊讶包含以下代码行的文件被成功编译并且链接器生成了一个可执行文件。我认为除了main之外的所有函数都必须有一个有效的return语句,除非返回类型是void。
int foo(){}
double bar(){}
int main(){}
我错过了什么?
【问题讨论】:
我很惊讶包含以下代码行的文件被成功编译并且链接器生成了一个可执行文件。我认为除了main之外的所有函数都必须有一个有效的return语句,除非返回类型是void。
int foo(){}
double bar(){}
int main(){}
我错过了什么?
【问题讨论】:
不从一个函数中返回一个表明它确实的值是未定义的行为。它编译和链接,但不要期望程序正常运行。
如果你以高警告级别编译,编译器会告诉你。
【讨论】:
我认为除了
main之外的所有函数都必须有一个有效的return语句,除非返回类型是void。
是的,他们必须这样做。如果他们不这样做,您将获得未定义的行为。
我错过了什么?
如果函数足够复杂,编译器可能很难或不可能判断所有返回路径是否都返回值;所以编译器不需要诊断错误。
如果您启用警告,大多数编译器会在很多情况下发出警告。
【讨论】:
return 的switch 语句,您(但不是编译器)可以证明该值只能是处理的情况之一。在小型嵌入式系统上,您可能不希望处理(理论上不可能的)默认情况的开销。