为什么C语言中总是有主函数?

3
当使用C语言编写代码时,必须包含main函数。我一直有一个问题:在Python或JavaScript的情况下,不需要主函数。然而,在C语言中,我为什么要包含main函数呢?
这会提高性能吗?
还是只是为了区分主要部分和其他部分?
如果您能解释原因,我将不胜感激。

C程序是通过编译多个源文件并将生成的机器代码链接在一起构建的。如果C允许在全局范围内运行任意语句(这基本上就是JavaScript和Python所做的),那么你将如何控制来自多个模块的语句运行的顺序? - jamesdlin
1
main 函数的一个用途是作为程序其余部分的入口点(例如,如果您查看任何汇编代码,您会注意到有一个名为 _startmain 的全局入口点,所有代码都从这里开始)。高级语言中的 main 函数通常作为该入口点使用。更多信息请参见:https://en.wikipedia.org/wiki/Entry_point - mediocrevegetable1
1
@mediocrevegetable1 在Linux中编译的二进制程序可能会同时有“_start”和“main”。在调用“main”之前,还需要进行许多工作,例如一些“glibc”初始化等。 - Daniel Langr
哦,有趣啊。我想今天我甚至学到了一些东西。 - mediocrevegetable1
指定main()作为入口点意味着所有C或C++程序员都知道要查找main()函数以找到大多数程序开始执行的位置。在解释性语言中,类似于main()函数的东西通常是不需要的,因为其他启动程序的方式已经被指定(例如,在解释器提供的第一个脚本中具有某些特征的第一个函数)。与C或C++相比,这些方法都有优缺点,后者具有单个设计的入口点(尽管main()可以具有不同的签名)。 - Peter
3个回答

7
有两个主要原因,它们有些相关。
首先,对于任何给定的可执行文件,知道从哪里开始执行非常重要。在像Python这样的语言中,会有一个脚本被执行,虽然它可以包含其他代码,但人们都知道有一个“main”脚本。
但是在C这样的语言中并非如此,许多文件会被编译并链接成最终的可执行文件。这些文件编译和链接的顺序在大多数情况下并不重要,在一般情况下它们都被视为相同。因此,“特殊”的函数名main被保留用作入口点。
在C以及其衍生语言C++中,有很多你必须在函数内部完成的任务,而不允许在代码的主体中完成。在其他语言中,这种区别不存在。在C中,你需要至少一个函数才能做任何有用的事情,并且该函数将被称为main
这种区别并不仅限于脚本语言(如Python)与编译语言(如C)之间的比较。Swift是一种编译语言,但也允许类似于脚本的编码方式,其中不需要main()函数。这完全取决于语言设计以及考虑到的约束条件。
这也仅适用于可执行文件。对于库而言,不存在一个入口点,有多少个函数就有多少个入口点。任何你导出的函数都可以按需调用,并且可以按照库定义的API进行任意顺序调用。
你甚至可以将可执行文件视为具有有效一个函数main()的“库”。

4
程序启动后,所有具有静态存储期的对象被初始化完成后,主函数将被调用。这是在托管环境(也就是带操作系统的环境)下执行的程序的指定入口点。任意独立程序(例如引导加载程序、操作系统内核等)的入口点名称和类型是由实现定义的。
main() 函数是程序开始执行时执行的第一个函数,但它不是第一个被执行的函数。第一个函数是 _start() 函数,通常由 C 运行库提供,并在编译时自动链接。详细情况高度依赖于操作系统和编译器工具链,因此我会假装我没有提到它。
您可以编写没有 main 函数的 C 库,并从具有 main 函数的其他 C 程序中调用这些函数。

0

编程中需要一个起点,编译器从这个起点开始编译主代码。在C语言中,可以使用main()函数来提供这个起点。


3
编译器不会从 main() 开始编译代码。 - Blastfurnace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接