什么是回报;在布尔返回类型为return的C函数中?

什么是回报;在布尔返回类型为return的C函数中?,c,function,boolean,return,undefined-behavior,C,Function,Boolean,Return,Undefined Behavior,假设C中的函数为布尔返回类型(布尔可以实现为0和1的枚举或其他方式,但这并不重要): 这是什么回报?它是否返回FALSE?或者它只是退出函数而不返回?期望从foo返回的函数将收到什么?这是未定义的行为,没有表达式的return语句只能在返回类型为void的函数中使用。这在返回语句的章节6.8.6.4 […]没有表达式的返回语句只能出现在函数中 其返回类型为void 有趣的是,当使用clang时,默认情况下这是一个错误,但是没有任何标志的gcc似乎允许此代码甚至没有警告。对于gcc,使用-std=

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


这是什么回报?它是否返回FALSE?或者它只是退出函数而不返回?期望从foo返回的函数将收到什么?

这是未定义的行为,没有表达式的return语句只能在返回类型为void的函数中使用。这在返回语句的章节
6.8.6.4

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

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

在使用
gcc
clang
编译C程序时,需要使用的一组好标志如下:

-std=c99-墙壁-Wextra-Wconversion-迂腐

根据C99标准(草案)第6.8.6.4节“返回声明”(第1段),将
-std
调整为目标的适当标准。

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

所以代码是无效的

使用带-Wall的GCC编译此文件时会引发错误:

警告:在返回非void的函数中,“return”不带值 [-Wreturn类型]

虽然它在不使用-Wall时编译并返回1(true),但我猜这是GCC的优点(?)


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

忽略了以下事实,即此代码具有未定义的行为,因为它缺少返回语句的值

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


当在大多数现代CPU上运行时,它实际上没有定义的位寄存器和相关的编译器,它将返回一个int值。但是,现代编译器(启用了所有警告)不会编译该文件,但会发出关于无效返回类型(或类似语句)的警告,这是未定义的行为,不是吗?您的编译器应该对此提出投诉。如果您不确定,请运行代码。如果在
返回
之后添加
FALSE
,则它将返回
FALSE
。如果在
return
之后添加
TRUE
,则它将返回
TRUE
。调用
foo
的函数应该期望一个
boolean
值。@在许多情况下,使用未定义行为运行代码的siu不会告诉您任何有用的信息。要使用gcc将代码编译为C代码,必须使用
-std=cXX-pedantic errors
。如果不包括这两个选项,gcc仍然是一堆废话,而不是它可以设置为一个好的、严格符合标准的编译器。@Lundin我通常最后使用
-std=c99-Wall-Wextra-Wconversion-pedantic
进行测试,但大多数人似乎不使用标志。
boolean foo ()
{
  //do something

  return;
}