C函数的隐式int返回值
我GOOGLE了,似乎无法find这个简单的问题的答案。
在遗留代码基础上(最近移植到Linux,并慢慢更新到新的编译器),我看到了很多
int myfunction(...) { // no return... }
我知道一个函数的隐式返回types是int,但是当没有指定返回值时隐式返回值是什么。 我已经testing并得到0,但这只是与海湾合作委员会。 这是编译器具体还是标准定义为0?
从新约中引用的'89标准:
从一个函数的末尾stream出相当于一个没有expression式的返回。 无论哪种情况,返回值都是未定义的。
该标准通常expression了现有实施的现场行为。
这只是未定义的行为; 如果你不填充返回区域(例如, 在x86系列处理器上通常是eax / rax ),那么它将通过函数中的一些副作用来设置最后的值。
请参阅对于不返回void的C ++函数强制使用return语句吗? 这基本上是这个问题的重复(除了它被标记为C ++)。
这样的事情是可能的,但只有在函数返回值从不使用的假设下。 C11标准在第6.9.1段中说:
如果到达终止函数的},并且调用者使用该函数调用的值,则行为是不确定的。
(AFAIR以前版本的标准有类似的措辞)
所以将这种types的所有函数转换为void
函数是一个好主意,所以这样的函数的用户不会被诱惑使用返回值。
即使函数返回types不是void
,return语句在函数结束时也不是强制的。 没有诊断是必需的,它不是未定义的行为。
示例(定义的行为):
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;
在函数中的语句,那么你需要决定哪一个是更好的行为,并使它们一致 – 要么始终返回一个值,并将types保留为int
或从不返回值,并将types更改为void
。
请注意,由于int
的默认返回types(假定返回types)不再是int
,所以需要声明经过修改的函数以返回void
(在头文件中,除非它们是 – 或者应该是 – static
并且隐藏在单个源文件中)有效。
该函数可能总是为零,但在大多数体系结构(当然是x86)中,return语句将特定寄存器的内容移动到堆栈中的特定位置,调用者将检索并将其用作其返回函数。
return语句将把传递给它的variables放在那个位置,这样它将是一个不同的值。 我没有给出具体的回报声明的经验是,它相当随机的回报,你不能依靠它是相同的事情。
我确定这是一个函数的未定义的行为,其返回types不是void
以省略return
语句。 在C99中, main
是一个例外,如果return
语句被省略,则假定隐式地返回0,但是这不适用于任何其他函数。
它可能在特定的平台/编译器组合上工作,但不应该依赖这些细节。 在你的代码中使用任何一种未定义的行为都是不可移植的。 尽pipe在遗留代码中看到未定义的行为是很常见的。