C函数的隐式int返回值

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调整接受的答案基于它引用更新版本的标准.

dmc*_*kee 21

从新约中引用的'89标准来看:

流出函数的末尾相当于没有表达式的返回.在任何一种情况下,返回值都是未定义的.

该标准通常表达预先存在的实现的实地行为.


mod*_*ine 10

这只是未定义的行为; 如果你没有填充返回区域(例如通常是x86系列处理器上的eax/rax),它将具有最后通过函数中的一些副作用设置的值.

请参阅对于不返回void的C++函数是否必须使用return语句?这基本上是这个问题的副本(除了标记为C++).

  • 不完全是,如果使用返回值,这只是UB,这可能不是这里的情况,请参阅我的答案. (2认同)

Jen*_*edt 10

这样的事情是可能的,但只能假设从不使用函数的返回值.C11标准在第6.9.1段中说:

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

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

因此,将所有类型的函数转换为函数是一个好主意void,因此没有这种函数的用户可能会想要使用返回值.

  • 好吧,你是说**只要我们不读它**,程序的行为就仍然没问题吗? (2认同)

oua*_*uah 9

即使函数返回类型不是,函数结束时也不会强制返回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;语句一样.

  • @dmckee这就是为什么我写的:*"但是读取foo的返回值是未定义的行为"* (3认同)