繁体   English   中英

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

[英]How do C++ progs get their return value, when a return is not specified in the function?

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

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

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

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

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

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

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

g++ main.cc -g -o it_util

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

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

谢谢!!

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

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

myfunc() {....}

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

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

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

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

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

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

从C ++标准部分6.6.3返回语句

流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为。

有一个例外(根据3.6.1 / 5):

如果控制到达main的末尾而没有遇到return语句,则效果是执行return 0;

James Curran很好地理解了这在语法上允许的原因。 但是使用-Wall gcc选项(由Neil评论)你应该对这种行为发出警告; 类似'并非所有控制路径都在值返回函数中返回值...'。

这取决于调用约定。 例如,对于Intel平台上的32位整数返回,您可以获得eax寄存器中的任何内容。

使用现代编译器,您可能会使用-Wall获得警告

但是如果你没有返回一个值,通常你会得到垃圾。

“什么决定了在函数中没有执行返回命令时c ++函数返回什么?它有什么逻辑吗?”

函数开头的类型。

例:

int cow(){int temp; 回温; }

如果您没有返回正确的类型或什么都不返回,编译器应该抱怨。 编辑:哦,废话,我刚读过你的旗帜。 你需要打开更多的旗帜,-W -Wall -pedantic。 阅读g ++手册。

除非你有无效功能。 然后你不必返回任何东西,或者你可以指向游戏。

void somefunction(int * ptr_int){int temp = * ptr_int; temp + = 1000; this-> ptr_int = temp; }

我相信上面的代码是有效的,因为我用C ++编写了一段时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM