具有缺失返回值的函数,运行时的行为

时间:2010-04-08 06:54:03

标签: c++

正如预期的那样,编译器(VisualStudio 2008)将发出警告

  

警告C4715:'doSomethingWith':不是   所有控制路径都返回一个值

编译以下代码时:

int doSomethingWith(int value)
{
    int returnValue = 3;
    bool condition = false;

    if(condition)
        // returnValue += value; // DOH

    return returnValue;
}

int main(int argc, char* argv[])
{
    int foo = 10;
    int result = doSomethingWith(foo);
    return 0;
}

但程序运行得很好。函数doSomethingWith()的返回值为0。

是仅仅是未定义的行为,还是存在一定的规则如何在运行时创建/计算结果值。非POD数据类型作为返回值会发生什么?

4 个答案:

答案 0 :(得分:17)

它是ISO C ++标准6.6.3节中指定的未定义行为:

  

离开函数的末尾是   相当于没有价值的回报;   这会导致未定义的行为   价值回归功能。

答案 1 :(得分:7)

对于x86处理器,标准调用约定将返回值放入EAX寄存器。实际上,这意味着对于大多数编译器,如果我们到达函数的末尾而不返回,则将返回最后一个数学运算的结果。但是,你不能依赖它而且它不便携。

http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl

答案 2 :(得分:2)

不从值返回函数返回值会导致未定义的行为。

答案 3 :(得分:2)

更新@piotr回答。

来自C++17 Standard第9.6.3节

  

在构造函数,析构函数或函数的末尾流动    cv void返回类型等同于没有操作数的返回。   否则,流出除main之外的函数的末尾(6.6.1)   导致未定义的行为。