是C程序所需的main()吗?

elr*_*icL 42 c language-lawyer

好吧标题说明了一切.是一个main()函数的C程序绝对必要的?

我问这个是因为我在查看Linux内核代码,但我没有看到main()函数.

pax*_*blo 63

不,ISO C标准规定main只有托管环境(例如具有底层操作系统的环境)才需要功能.

对于像嵌入式系统(或操作系统本身)这样的独立环境,它的实现是定义的.来自C99 5.1.2:

定义了两个执行环境:独立和托管.在这两种情况下,当执行环境调用指定的C函数时,程序启动发生.

在独立环境中(可以在没有操作系统任何好处的情况下执行C程序),程序启动时调用的函数的名称和类型是实现定义的.

至于Linux本身是如何启动的,Linux内核的起点是start_kernel,为了更全面地了解整个启动过程,你应该从这里开始.

  • 无论实施者想要它在哪里. (17认同)

Ign*_*ams 9

main()函数由libc附带的目标文件调用.由于内核没有链接到libc,因此它有自己的入口点,用汇编语言编写.


Dig*_*oss 9

嗯,不,但......

C99指定main()在"程序启动时"在托管环境中调用,但是,您不必使用C运行时支持.您的操作系统执行映像文件并在链接器提供的地址处启动程序.

如果您愿意编写程序以符合操作系统的要求而不是C99的要求,则可以在没有main()的情况下完成.但是,系统越现代化(越复杂),C库就越难以使用标准运行时启动的假设.

这是Linux的一个例子......

$ cat > nomain.S
.text
_start:
    call    iamnotmain
    movl    $0xfc, %eax
    xorl    %ebx, %ebx
    int     $0x80
.globl _start
$ cat > demo.c

void iamnotmain(void) {
    static char s[] = "hello, world\n";
    write(1, s, sizeof s);
}
$ as -o nomain.o nomain.S
$ cc -c demo.c
$ ld -static nomain.o demo.o -lc
$ ./a.out
hello, world
Run Code Online (Sandbox Code Playgroud)

现在可以说它不是"C99程序",只是一个带有用C语言编写的目标模块的"Linux程序".