Lev*_*viX 24 c function legacy-code
我用Google搜索,似乎无法找到这个简单问题的答案.
使用遗留代码库(最近移植到Linux,并慢慢更新到新的编译器),我看到了很多
int myfunction(...)
{
// no return...
}
Run Code Online (Sandbox Code Playgroud)
我知道函数的隐式返回TYPE是int,但是当没有指定返回时,隐式返回VALUE是什么.我已经测试过并且得到了0,但这只是用gcc.这个编译器是特定的还是标准定义为0?
编辑:12/2017调整接受的答案基于它引用更新版本的标准.
mod*_*ine 10
这只是未定义的行为; 如果你没有填充返回区域(例如通常是x86系列处理器上的eax/rax),它将具有最后通过函数中的一些副作用设置的值.
请参阅对于不返回void的C++函数是否必须使用return语句?这基本上是这个问题的副本(除了标记为C++).
Jen*_*edt 10
这样的事情是可能的,但只能假设从不使用函数的返回值.C11标准在第6.9.1段中说:
如果到达终止函数的},并且调用者使用函数调用的值,则行为是未定义的.
(AFAIR以前版本的标准有类似的措辞)
因此,将所有类型的函数转换为函数是一个好主意void,因此没有这种函数的用户可能会想要使用返回值.
即使函数返回类型不是,函数结束时也不会强制返回return语句void.不需要诊断,也不是未定义的行为.
示例(已定义的行为):
int foo(void)
{
}
int main()
{
foo();
}
Run Code Online (Sandbox Code Playgroud)
但是读取返回值foo是未定义的行为:
int bla = foo(); // undefined behavior
Run Code Online (Sandbox Code Playgroud)
从C标准:
(C99,6.9.1p12)"如果达到了终止函数的},并且调用者使用了函数调用的值,则行为是未定义的."
该main函数是此规则的一个例外,就好像它}中的到达main一样,就像有一个return 0;语句一样.