当函数中没有指定返回时,C++程序如何获得它们的返回值?

Jas*_*ick 5 c++ memory return return-value

我最近写了一篇文章:
C++程序中的奇怪错误:删除打印输出中断程序

...我试图解决一个看似令人困惑的问题,其中删除一个cout语句会破坏我的程序.

事实证明,我的问题是我忘了返回我后来用于逻辑的真/假成功标志.

但显然SOMETHING正在被归还,如果我把那个cout留在那里,事情总是如此,但是当我把它拿出来时,看起来似乎"神奇地"变得虚假.

我的问题是:
当函数中没有执行返回命令时,什么决定了c ++函数返回什么?它有什么逻辑吗?

显然忘记你的回归类型是个坏主意.在这种情况下,这主要是由于我的程序的性质 - 一个快速的黑客工作.我后来决定,实现一个算法来确定函数调用的成功/失败是不值得的 - 但是意外地遗留了依赖于返回的代码.

令人困惑的是,在编译可执行文件时,g ++没有给出任何警告或错误:

g++ main.cc -g -o it_util
Run Code Online (Sandbox Code Playgroud)

我的版本是:g ++(GCC)4.1.2 20080704(Red Hat 4.1.2-44)

再一次,为了拯救他人未来的挫败感,如果他们犯了同样的愚蠢错误,并且遇到了同样看似不稳定的行为,那么任何人都可以指望没有返回的函数从哪里得到它的返回值?

谢谢!!

Jam*_*ran 5

它没有逻辑,大多数C++编译器都应该用警告标记它.它允许向后兼容C.

在K&R C中,没有void类型,当未指定类型时,默认为int.所以,

myfunc() {....}
Run Code Online (Sandbox Code Playgroud)

techincally是一个返回int的函数,但是大多数程序员使用该表单来执行不返回值的例程.

编译器必须理解这一点.因此,惯例变成了,return将把东西放入寄存器.并且调用例程中的赋值将从寄存器中取出值.现在,如果被调用者从未发出返回,则该寄存器中不会放置任何特定内容.但它仍然会有一些(随机)值,这将在调用者中盲目地分配.


Ped*_*ino 5

在x86调用约定中,整数和指针的返回值位于EAX寄存器中.以下是一个例子:

int func() {
    if(0) return 5; // otherwise error C4716: 'func' : must return a value
}
int main() {
    int a;
    a = func();
}
Run Code Online (Sandbox Code Playgroud)

cl.exe /Zi,MSVC++ 10 编译:

push    ebp
mov     ebp, esp
push    ecx
call    j_?func@@YAHXZ  ; func(void)
mov     [ebp+a], eax ; assumes eax contains the return value
xor     eax, eax
mov     esp, ebp
pop     ebp
retn
Run Code Online (Sandbox Code Playgroud)

当然,这是所有未定义的行为.