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

时间:2014-11-20 15:00:41

标签: c function boolean return undefined-behavior

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

boolean foo ()
{
  //do something

  return;
}

这是什么回报?它返回FALSE吗?或者只是退出函数而没有任何回报?函数期望foo返回的函数是什么?

3 个答案:

答案 0 :(得分:7)

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

  

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

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

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

  

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

clang调整为您要定位的相应标准。

答案 1 :(得分:3)

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

  

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

因此代码无效。

使用带-Wall的GCC进行编译会引发错误:

  警告:'返回'没有价值,在函数返回非void   [-Wreturn型]

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

(摘自 WG14 / N1256委员会草案 - 2007年第7章ISO / IEC 9899:TC3

答案 2 :(得分:0)

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

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

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