关于返回值:
func()
{
while(1)
{
/* do stuff here */
if(error1) exit(0);
if(error2) break;
}
/* no return statement anywhere in func() */
}
但是调用者检查func()
的返回码if(func()) {/* error handling */}
有人确认func()
的返回值不会默认为任何东西而且是垃圾的。这对所有这些都是如此:
void func()
int func()
,根本没有返回语句,或者使用普通return;
。func()
,未指定的返回类型,我理解默认返回int。感谢..
答案 0 :(得分:3)
注意:此答案适用于C89(及更早版本)。
void func()
指定不返回值的函数。在这种情况下,if (func())
应该导致编译错误。
int func()
和func()
是等效的,并返回一个整数值。
如果return语句没有提供任何值,则结果是未定义的,如果警告级别足够高,编译器将发出警告。
实际上,大多数编译器都会生成代码,返回寄存器中的内容或用于返回值的内存位置。
答案 1 :(得分:2)
函数的返回值通常是处理器的第一个寄存器返回的 ,例如。基于x86的EAX或基于ARM的处理器的r0。它是特定于编译器的,但这或多或少是标准的。
例如,C中的return 10;
将被翻译为
mov eax 10 ; pseudo code
ret ; pseudo code
在基于x86的处理器的程序集中。
&安培;在检查返回值时,它只会检查eax寄存器。该寄存器中包含的内容被调用者视为返回值。
SO ...如果你没有返回值(简单return;
)或者它是一个void函数,那么在汇编中ret
语句之前的EAX中包含的任何值都被视为返回值来电者。
对于基于ARM
的处理器,请在上面的答案中将EAX
替换为r0
。 : - )
我将此事实用作以下功能的黑客; - )
void* getStackTop(){
asm("mov eax esp");
}
要在从C语言转换为ASM时检查其工作原理,请编写如下的简单代码:
int testfn(int unused){
int unused2=unused; // Check how input is passed
return 10; // Check how output is returned
}
&安培;然后用gcc -S
编译它。 (或者您的编译器带有一些只会生成程序集的标志。)
我不确定它是如何返回float / struct值的。 可能它返回一个指向struct&的指针。整个返回的结构是在引擎盖下记忆,同时转换为asm。有人可能会纠正: - )
答案 2 :(得分:0)
自C99标准以来,您在无效C代码中发布的代码。
如果您使用的是实现C90标准的过时编译器,它将进行编译,然后默认类型为int。我相信从这样的函数中省略return语句会导致未定义的行为,但我不能引用C90标准。