【问题标题】:Reaching end of function without return statement在没有返回语句的情况下到达函数结尾
【发布时间】:2016-09-06 02:27:57
【问题描述】:
ANSI X3.159-1989,第 3.6.6.4 节,第 33-35 行状态:
“如果执行了没有表达式的 return 语句,并且
调用者使用函数调用的值,行为是
不明确的。到达终止函数的 } 等效于
执行没有表达式的 return 语句。”
我一直在查看ISO/IEC 9899:1999(E)、ISO/IEC 9899:2011(E)、ISO/IEC 14882:2011(E) 和ISO/IEC 14882:2014(E) 中的类似语句,尤其是第二句,但我发现的所有内容都与函数 main 相关。如果有人能指出我在这些文件中的任何一份中的正确位置(我不在乎),我将不胜感激。
【问题讨论】:
标签:
c++
c
language-lawyer
【解决方案1】:
在 C99 TC2 和 C11 中都是 6.9.1/12:
如果到达终止函数的},并且调用者使用了函数调用的值,则行为未定义。
在 C++11 和 C++14 中是 [stmt.return]/2:
从函数的末尾流出相当于没有值的返回;这会导致值返回函数中的未定义行为
【解决方案2】:
至于第一句话(您的来源似乎是错误的或过时的):
C 2011 6.8.6.4 返回语句
1 带有表达式的 return 语句不得出现在返回类型为 void 的函数中。没有表达式的 return 语句只能出现在返回类型为 void 的函数中。
关于第二句:
C 2011 6.9.1 函数定义
12如果到达终止函数的},并且调用者使用了函数调用的值,则行为未定义。