我GOOGLE了,只是似乎无法找到答案,这个简单的问题。
在传统的代码库(移植到Linux最近,慢慢升级到新的编译器),我看到了很多
int myfunction(...)
{
// no return...
}
我知道一个函数的隐式返回类型为int,但没有指定返回时,什么是隐含的返回值。 我测试过,并得到0,但这只是用gcc。 这是编译器特定的还是它的标准定义为0?
编辑:基于它引用标准的最新版本二千零十七分之十二调整接受的答案。
我GOOGLE了,只是似乎无法找到答案,这个简单的问题。
在传统的代码库(移植到Linux最近,慢慢升级到新的编译器),我看到了很多
int myfunction(...)
{
// no return...
}
我知道一个函数的隐式返回类型为int,但没有指定返回时,什么是隐含的返回值。 我测试过,并得到0,但这只是用gcc。 这是编译器特定的还是它的标准定义为0?
编辑:基于它引用标准的最新版本二千零十七分之十二调整接受的答案。
这样的事情是可能的,但只有在该函数的返回值永远不会使用的假设。 在C11标准说,在第6.9.1:
如果}终止函数达到和函数调用的值由主叫方,该行为是不确定的。
(标准的AFAIR以前的版本也有类似的措辞)
因此,这将是改变那种你必须的所有功能,是一个好主意void
功能,所以没有这样的功能的用户可能会倾向于使用返回值。
从引新约圣经的'89标准:
流下的一个函数的末尾是等同于无表达回报。 在这两种情况下,返回值是不确定的。
该标准通常表达预存实现的对实地的行为。
这简直是不确定的行为; 如果你不填充返回区域(例如通常是在x86系列处理器EAX / RAX ),这将有最后通过在你的函数一些副作用设置的值。
见一个return语句强制C ++函数不返回无效? 这基本上是这个问题的一个重复的(不同之处在于它的标记为C ++)。
return语句在函数结束从来没有强制性的,即使该函数的返回类型不是void
。 没有诊断是必要的,它不是不确定的行为。
实施例(定义行为):
int foo(void)
{
}
int main()
{
foo();
}
但是阅读的返回值foo
是未定义的行为:
int bla = foo(); // undefined behavior
从C标准:
(C99,6.9.1p12)“如果}终止达到的功能,并且该函数调用的值用于由呼叫者,该行为是未定义”。
的main
功能是一个例外仿佛}
达到在main
就相当于好像有一个return 0;
声明。
如果return
语句始终没有返回值,函数是最好的转换并声明为,返回void
:
void myfunction(...)
{
...
return;
...
}
如果有一些一些return expr;
有的return;
在函数语句,那么你需要决定哪个是更好的行为,使他们一致的-要么始终返回一个值,离开类型int
或从不返回值,更改为类型void
。
请注意,您需要声明修改返回功能void
(在头部,除非他们是-或者应该是- static
和隐藏在一个源文件),因为默认的返回类型(假定返回类型) int
不再有效。
它可以永远是那个函数为零,但在大多数架构(当然86)return语句特定的寄存器的内容移动到一个特定的地方栈调用者将检索并作为它的返回功能使用上。
return语句将会把传递给它在该位置的变量,以便它会是一个不同的值。 我与不放置特定return语句的经验是,其相当随机得到什么回来了,你不能依赖它是同样的事情。
我敢肯定,这是它的返回类型是不是一个函数未定义行为void
,以省略return
语句。 在C99有一个例外main
,如果在那里return
省略声明,假设隐含返回0,但是这并不适用于任何其他功能。
它可以在特定的平台/编译器组合工作,但你永远不应该依赖于这样的细节。 在代码中使用任何类型的未定义行为使得不可移植。 这是经常可以看到的遗留代码未定义的行为虽然。