为了账号安全,请及时绑定邮箱和手机立即绑定

C函数的隐式int返回值

/ 猿问

C函数的隐式int返回值

C
烧仙草VB 2019-10-21 15:06:55

我已经用谷歌搜索,但似乎找不到这个简单问题的答案。


在旧版代码库上工作(最近移植到Linux,然后慢慢更新到新的编译器),我发现很多


int myfunction(...)

{

// no return...

}

我知道函数的隐式返回类型是int,但是没有指定返回时的隐式返回值是什么。我已经测试并获得0,但这仅适用于gcc。这个编译器是特定的还是标准定义为0?


编辑:12/2017调整可接受的答案基于它引用了该标准的最新版本。


查看完整描述

3 回答

?
陪伴而非守候

这样的事情是可能的,但前提是永远不要使用函数的返回值。C11标准在6.9.1节中指出:


如果到达终止函数的},并且调用者使用了函数调用的值,则该行为未定义。


(AFAIR以前的标准版本具有类似的措词)


因此,将您必须具有的那种所有功能转换为功能将是一个好主意void,这样就不会诱使此类功能的用户使用返回值。


查看完整回答
反对 回复 2019-10-21
?
qq_笑_17

根据新约中引用的'89标准:


从函数末尾流出就等于没有表达式的返回。无论哪种情况,返回值都是不确定的。


该标准通常表示现有实现的实际行为。


查看完整回答
反对 回复 2019-10-21
?
qq_遁去的一_1

即使函数的返回类型不是,return语句也不会在函数末尾强制执行void。不需要诊断,并且它不是未定义的行为。


示例(定义的行为):


int foo(void)

{

}


int main()

{

    foo();

}

但是读取的返回值foo是未定义的行为:


int bla = foo();  // undefined behavior

从C标准:


(C99,6.9.1p12)“如果到达终止函数的},并且调用者使用了函数调用的值,则该行为未定义。”


该main函数是该规则的例外,就像}到达该规则一样,main就好像有一条return 0;语句一样。


查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信