[英]what's the meaning of exit code of program with empty void main()?
我制作了一个简单的 C 程序,如下所示,主程序为空,并用 gcc 编译
void main(){
}
执行时,它返回退出代码为25
,如果我添加一个 printf 语句,包含 stdio.h 后,它返回退出代码5
这里的25
和5
是什么意思,为什么在 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 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.