在布尔返回类型的C中说一个函数(布尔值可以实现为0和1的枚举或其他方式,但这并不重要):
boolean foo ()
{
//do something
return;
}
这是什么回报?它返回FALSE吗?或者只是退出函数而没有任何回报?函数期望foo返回的函数是什么?
答案 0 :(得分:7)
这是未定义的行为,没有表达式的return语句只能在返回类型为void的函数中使用。这包含在draft C99 standard部分6.8.6.4
返回声明:
[...]没有表达式的return语句只能出现在函数中 返回类型无效。
有趣的是,在使用clang
时默认情况下这是一个错误,但gcc
没有任何标志似乎允许此代码甚至没有警告。对于使用gcc
的{{1}},将其转换为警告并使用-std=c99
标志使其成为错误。
在使用-pedantic-errors
或gcc
编译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值。但是现代编译器(启用了所有警告)将不会编译该文件,但会引发有关无效返回类型(或类似语句)的警告