我从同事那里了解到,无需编写函数即可编写和执行C程序main().它可以在下面完成
withoutMain.c
/* Compile this with gcc -nostartfiles */
#include <stdlib.h>
void _start() {
int ret = my_main();
exit(ret);
}
int my_main() {
puts("This is a program without a main() function!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将其编译为:
my_main.c
运行方式为:
main()
我的问题是,何时需要做这种事情?一些现实世界的场景?
fuz*_*fuz 95
符号_start是程序的入口点.也就是说,该符号的地址是程序启动时跳转到的地址.通常,具有名称的函数_start由一个文件提供,该文件crt0.o包含C运行时环境的启动代码.它设置一些东西,填充参数数组argv,计算有多少参数,然后调用main.后main返回时,exit被调用.
如果程序不想使用C运行时环境,则需要提供自己的代码_start.例如,Go编程语言的参考实现是这样做的,因为它们需要一个非标准的线程模型,这需要一些神奇的堆栈._start当你想编写非常小的程序或程序来做非传统的事情时,提供你自己的东西也很有用.
Mik*_*eMB 43
main从程序员的角度来看,虽然它是程序_start的入口点,但是从操作系统的角度来看是常见的入口点(从OS启动程序后执行的第一条指令)
在典型的C和特别是C++程序中,在执行进入main之前已经完成了很多工作.尤其是全局变量的初始化. 在这里你可以找到一个很好的解释,在主要已经退出之间_start()和main()之后发生的一切(见下面的评论).
它的必要代码通常由编译器编写者在启动文件中提供,但是使用该标志–nostartfiles你基本上告诉编译器:"不要打扰给我标准的启动文件,让我完全控制正在发生的事情.开始".
这有时是必要的,并且经常在嵌入式系统上使用.例如,如果您没有操作系统,则必须在初始化全局对象之前手动启用内存系统的某些部分(例如缓存).