是的,你可以编写一个没有main()的C程序 。
这是一个广受好评的“Hello World”程序,没有main()。
- #include <stdio.h>
- extern void _exit (register int );
- int _start (){
- printf (“ Hello World \ n ”);
- _exit (0 );
- }
几乎每本书都教我们main()是程序执行的切入点。这不完全正确。从抽象层面来说,从程序员的角度来看也是如此。但是从系统的角度来看,_start()是第一个被调用的函数。_start()设置程序执行的环境,然后调用main()。
这是上述程序的输出。
编辑1:这里有一些关于为什么我写了extern void _exit(register int)的信息;
_start()和_exit()是“系统”在程序执行之前自动调用以设置环境并执行其他一些机器级工作的函数。_exit()是预定义的,因此我们使用外部存储类(即extern)告诉编译器它已经在某处声明了。如果我们错过了extern关键字,我们试图重载在C语言中无效的函数。
_exit()在机器级工作,因此它需要具有寄存器存储类的数据类型的输入,因此使用了register关键字。如果你不编写extern void _exit(register int),编译器会给你一个警告,但程序运行正常:)
编辑2:我今天收到了这条消息:
你怎么知道首先调用_start然后调用main()?
我问这个问题的唯一目的是从哪里可以获得有关编程的这些细节?
在每本书中,我们都可以轻松找到语法和所有语言结构,但这些东西缺少某些细节。
能帮助我/指导我从哪里了解这些细节吗?
实际上这是一个非常好的问题,这就是为什么我要更新我的答案,但答案很简单,比你想象的要简单。一切都在我们面前,我们只需要更多地关注我们通常忽略的微小细节。
因此,为了让您知道我如何了解_start,我将使用一个示例向您展示。这是一个我编写的简单程序,它没有main()。
现在让我们编译并运行该程序,看看会发生什么。
它说在函数_start中:对main的未定义引用。这意味着_start()中没有对main()的引用。
那是我开始了解_start的时候。然后只是谷歌的一点帮助我发现了这个函数到底是什么,它是在main()之前首先调用的函数。所以你看,我们必须停止忽略错误或警告,并应该寻找它们实际意味着什么。唯一能教你学习并让你学习的老师就是你自己:)