繁体   English   中英

带有空 void main() 的程序的退出代码是什么意思?

[英]what's the meaning of exit code of program with empty void main()?

我制作了一个简单的 C 程序,如下所示,主程序为空,并用 gcc 编译

void main(){
}

执行时,它返回退出代码为25 ,如果我添加一个 printf 语句,包含 stdio.h 后,它返回退出代码5

这里的255是什么意思,为什么在 main() 之前或之后执行的任何代码都会返回它? 如果我使用 int main() 并且不放置 return 语句,则退出代码为零。

这里的 25 和 5 是什么意思

C 语言规范没有定义main()被声明为返回void的程序的行为。 尽管如此,接受此类代码的实现可能会或可能不会为其定义行为。 因此,在一般意义上,退出状态对于具有void main()的程序没有任何意义或意义。

显然, GCC 确实接受了该代码,但我在GCC 记录的 C extensions中找不到其行为的定义,因此在这种特殊情况下,您观察到的退出状态都没有任何意义。

以及为什么在 main() 之前或之后执行的任何代码都会返回它?

没有特别的原因。 行为未定义。

如果我使用 int main() 并且不放置 return 语句,则退出代码为零。

那个案子是很好定义的。 C 指定如果执行到达对main()的初始调用结束(假定使用两个 C 标准签名之一声明,两者都返回int ),那么行为就像调用了exit(0)一样。 这是一个特例。 如果执行到达非void function 的右大括号,并且其调用者对返回值执行任何操作,则行为未定义。

(添加约翰·布林格的回答)

* 无效的主要

旧的 ISO C 标准 (ISO/IEC 9899:1999) 规定:

[main] 应被定义

  • 返回类型为int
    • 没有参数 […] 或
    • 带有两个参数 […] 或等效参数; 或者
    • 以其他一些实现定义的方式。

§ 5.1.2.2.1 ¶ 1 C 标准

如果返回类型与int不兼容,则返回给宿主环境的终止状态是未指定的。

§ 5.1.2.2.3 ¶ 1

这表明允许不返回int的 forms 是故意的。

许多编译器手册(例如 Watcom C/C++、IBM VisualAge C/C++、Microsoft Visual C/C++)声明main可能具有返回类型void ,因此具有void main()的程序是符合标准的程序。

很长一段时间以来,很多代码都是用void返回类型编写的。 gcc (可能)认为与遗留代码兼容很重要并允许void main()但在这种情况下:

  • 它发出警告( warning: return type of 'main' is not 'int' );
  • 程序的返回值未定义。

参考:

* int 主要

int main() {}

这在 C89/90 中是未定义的,并且在以下版本中定义良好(它返回0 )。

* 实际价值

在 x86 上, EAX寄存器通常用于返回值。 所以

int main() {}

被编译成类似的东西:

main:
        push    rbp
        mov     rbp, rsp
        mov     eax, 0
        pop     rbp
        ret

为了

void main() {}

最简单的操作是删除mov eax, 0

main:
        push    rbp
        mov     rbp, rsp
        nop
        pop     rbp
        ret

如果添加printf语句:

#include <stdio.h>

void main()
{
  printf("1234");
}

你得到:

.LC0:
        .string "1234"
main:
        push    rbp
        mov     rbp, rsp
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    printf
        pop     rbp
        ret

printf调用更改EAX寄存器(返回写入 stream 的字符数, EAX用于返回值)。

暂无
暂无

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

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