在 C 中省略 Return 语句
在 C 中,习惯上用 return 语句终止非 void 函数。然而,在与 Strawberry Perl 一起分发的 g 的特定 Windows 版本中观察到了奇怪的现象。此版本允许在返回非 void 值的函数中省略 return 语句,从而导致意外行为。
考虑以下成员函数:
struct boundTag Box::getBound(int side) { struct boundTag retBoundTag; retBoundTag.box = this; switch (side) { // set retBoundTag.bound based on value of "side" } }
此函数旨在返回表示绑定标签的结构。然而,开发人员无意中省略了 return 语句:
// ... code from above }
测试此函数时,尽管缺少 return 语句,开发人员仍收到了有效的输出。即使删除 return 语句后,代码编译时也不会出现任何警告。
根本问题是在非 void 函数中省略 return 语句会调用未定义的行为。 ISO C -98 标准明确指出,从非 void 函数末尾流出相当于返回无值,从而导致未定义的行为。
// ... code from above // Undefined behavior }
在这种情况下, g 可能返回 a垃圾值,因为编译器无法确定预期的返回值。在代码中使用此返回值是危险的,可能会导致不可预测的结果。
虽然默认情况下 g 可能不会发出警告,但在编译期间使用 -Wall 选项会强制编译器对这些情况发出警告。此选项将突出显示缺少的 return 语句并有助于防止此类未定义的行为。
因此,即使不立即使用返回值,也必须始终在非 void 函数中包含 return 语句。这种做法确保代码符合 C 标准并避免任何潜在的未定义行为。
以上是为什么在非 Void C 函数中省略 Return 语句有时会起作用(以及为什么不应该起作用)?的详细内容。更多信息请关注PHP中文网其他相关文章!