0

关于返回值:

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。

谢谢..

4

3 回答 3

3

注意:此答案适用于 C89(及更早版本)。

void func() 指定不返回值的函数。在这种情况下if (func())应该会导致编译错误。

int func()并且func()是等价的并返回一个整数值。如果 return 语句未提供任何值,则结果未定义,如果警告级别足够高,编译器会发出警告。在实践中,大多数编译器将生成返回用于返回值的寄存器或内存位置中的任何内容的代码。

于 2012-12-13T12:30:04.940 回答
2

函数的返回值通常由处理器的第一个寄存器返回,例如基于 x86 的 EAX 或基于 ARM 的处理器的 r0。它是特定于编译器的,但这或多或少是标准的。

例如return 10;在 C 中将被翻译成

mov eax 10 ; pseudo code
ret        ; pseudo code

在基于 x86 的处理器的汇编中。

& 在检查返回值时,它只会检查 eax 寄存器。该寄存器中包含的任何内容都被调用者视为返回值。

所以...如果您返回没有值(简单return;)或者它是一个 void 函数,那么在汇编中的语句之前包含在 EAX 中的任何值都会ret被调用者作为返回值。

对于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. (或者你的编译器带有一些只会生成程序集的标志。)


我不确定它如何返回浮点/结构值。可能它返回一个指向结构的指针,并且整个返回的结构在引擎盖下是 memcpy 的,同时转换为 asm。有人可能会纠正:-)

于 2012-12-13T12:28:23.087 回答
0

自 C99 标准以来,您在无效的 C 代码中发布的代码。

如果您使用的是实现 C90 标准的过时编译器,它将编译并且默认类型将是 int。我相信从这样的函数中省略 return 语句会导致未定义的行为,尽管我不能引用 C90 标准。

于 2012-12-13T12:32:50.237 回答