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在遗留代码中看到未定义的行为是很常见的。