【问题标题】:What does return; in a C function of boolean return type return?返回什么;在布尔返回类型的 C 函数中返回?
【发布时间】:2015-01-18 11:56:28
【问题描述】:

说一个布尔返回类型的 C 函数(布尔可以实现为 0 和 1 的枚举或其他方式,但这并不重要):

boolean foo ()
{
  //do something

  return;
}

这会返回什么?它返回 FALSE 吗?还是它只是退出函数而没有任何返回?期望从 foo 返回的函数会收到什么?

【问题讨论】:

  • 那是未定义的行为,不是吗?你的编译器应该抱怨这个。
  • 不确定时,运行代码。
  • 如果您在return 之后添加FALSE,那么它将返回FALSE。如果您在return 之后添加TRUE,那么它将返回TRUE。调用 foo 的函数应该期望 boolean 值。
  • @siu 在许多情况下运行具有未定义行为的代码根本不会告诉您任何有用的信息。

标签: c function boolean return undefined-behavior


【解决方案1】:

这是未定义的行为,没有表达式的 return 语句只能在返回类型为 void 的函数中使用。这在draft C99 standard 部分6.8.6.4 中进行了介绍return 语句

[...]没有表达式的 return 语句只能出现在函数中 其返回类型为 void。

有趣的是,使用clang 时默认这是一个错误,但没有任何标志的gcc 似乎允许此代码甚至没有警告。对于gcc,使用-std=c99 会将其变为警告,使用-pedantic-errors 标志会使其变为错误。

在使用 gccclang 编译 C 程序时习惯使用的一组很好的标志如下:

-std=c99 -Wall -Wextra -Wconversion -pedantic

-std 调整为您所针对的适当标准。

【讨论】:

  • 要使用 gcc 将代码编译为 C 代码,您必须使用-std=cXX -pedantic-errors。如果你不包括这两个选项,gcc 仍然是一个废话,而不是它可以设置为的好的、严格符合的编译器。
  • @Lundin 我通常最后使用-std=c99 -Wall -Wextra -Wconversion -pedantic 进行测试,但似乎大多数人通常不使用标志。
【解决方案2】:

根据(草案)C99 标准,6.8.6.4 The return statement 部分(第 1 段):

带有表达式的返回语句不应出现在函数中 其返回类型为 void。没有表达式的 return 语句 只能出现在返回类型为 void 的函数中。

所以代码是无效的。

使用带有 -Wall 的 GCC 编译它会引发错误:

警告:'return' 没有值,在函数中返回非 void [-Wreturn-type]

虽然它在不使用 -Wall 时编译并返回 1(真),但我猜这是 GCC 很好(?)。

(取自 WG14/N1256 委员会草案 — 2007 年 9 月 7 日 ISO/IEC 9899:TC3

【讨论】:

    【解决方案3】:

    忽略此代码具有未定义行为的事实,因为它缺少 return 语句的值....

    当在实际定义了位寄存器和相关编译器的 CPU 上运行时,返回的布尔值将在进位标志中。

    当在大多数实际上没有定义位寄存器和相关编译器的现代 CPU 上运行时,它将返回一个 int 值。但是现代编译器(启用所有警告)不会编译文件,但会引发有关无效返回类型(或类似语句)的警告

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 2012-07-15
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多