为什么名称main为函数main()
为什么函数名main()保留在许多语言中,如C,C ++,Java? 为什么没有该function的任何其他名称? 所有这3个main()是否有任何共同的结构(在C,C ++,Java中)
对于一个合理的问题,这里有很多愚蠢而不是非常尊重的答案。
C并非来自任何地方 。 它的直系祖先是B,由Ken Thompson编写。 这是B手册的链接。 B程序的基本结构是
主要(); 出口();
main()由程序员提供,exit()由库提供。 这似乎是main()的第一次出现,因为B的前身BCPL没有这样的概念。 我猜你肯定要问Ken Thompson为什么它是主要而不是别的东西。
另请注意,虽然名称main
是一种排序约定,但您可以随意命名您的输入函数,只要您告诉链接器入口点实际上是什么 。 从man ld
看到这个片段:
进入 --entry =条目 使用entry作为开始执行的显式符号 程序,而不是默认入口点。 如果没有sym- bol命名条目,链接器将尝试将条目解析为数字, 并将其用作入口地址(该数字将被解释 在基地10; 您可以使用前导0x表示基数16或前导0 对于基地8)。
此外,FWIW, ld
的入口点的第一选择是(有时)一个实际上称为_start
(但我认为它实际上是一个与平台相关的值)。
并看到这个邮件post ,它为ld
的-e
选项增加了一些解释:
-e
代替_start
,而不是main()
。 您必须知道系统运行时如何将参数传递给程序并复制crt [01in] .o和crt {begin,end} .o的一些function以调用main。
我无法找到gcc手册页中记录的位置,但您也可以将-e
传递给gcc以指定入口点; 然而,当你解决C的main
魔力时,它最终会成为一项相当复杂的任务。
$ cat junk.c int junk() { 返回8; } $ gcc -nostdlib -e _junk junk.c -o junk &&(./junk; echo $?) 8
因为C做到了,所以C ++保持它兼容,而Java则是为了简化从C ++的过渡。 早在Java的早期,雇主经常聘请具有C ++经验的人,因为它非常相似。 不像今天他们希望新人拥有比Gosling更多的Java经验。
并且不要忘记PL / 1为了相同的目的使用了“程序选项主”。 (伙计,那让人兴奋的一些记忆细胞一段时间没有被触及!)
您如何命名程序的主要function?
或者,为了更加迟钝,我们为什么要在路边开车呢?
答:我们必须选择一些东西。
它并不总是main()。
Java Applet使用init()和start()来挂接外部调用者。
Servlet通过init()和service()方法启动。
(服务将调度到更熟悉的doGet和doPost方法)
当然,这些exception确实依赖于操作系统以外的某些容器来调用方法。
更有趣的问题是……
你接近一些几乎有趣的问题……
- 是语言或图书馆的
main
部分? - 我的程序如何开始?
- 做什么在
main()
之前运行? - 什么是第一种使用
main()
语言? - 我可以编写一个不使用库的程序吗? 它需要一个
main()
吗? - 当我从main()返回时会发生什么?
- 为了给女孩留下深刻印象,我怎么能把名字从
main()
更改为更酷的东西?
快速回答:
- 为什么不?
- 为什么改变它? 要什么?
- 因为它是C,C ++和Java都具有共同祖先的症状之一(具体而言,C对其他两个影响很大)。 例如,您不会在Scheme或Prolog中看到main()。
就个人而言,我认为问题2a和2b的答案是最重要的。 如果你真的想打破世界上的每一个C / C ++ / Java程序,以便修复你认为单个函数名称有缺陷的美学,我将不得不问你是否按顺序优先考虑…. – )
因为它是主要function。 主要function一词至少从20世纪60年代开始使用。 在PL / I中,开始执行的函数具有以下标题:
FOO: PROCEDURE OPTIONS(MAIN);
其中FOO
是函数名称。
语言设计者必须选择“some”name和main()听起来像Main函数,因为那是执行开始的地方:)
可能是因为它是必须运行的主要function。 C ++从Cinheritance了名称,Java从C ++inheritance了它(程序员不喜欢改变)。
你必须说出一些东西。 我想不出更好的名字,因为这是主程序流程的起点。
除了获取参数的能力之外,没有共同的结构。 也不应该有一个共同的结构,因为程序的整个要点是做程序员想要的任何事情。 即,任何事情。
好吧,要么必须有一个固定的名称,要么你必须给程序员一个指定名称的方法。
如果程序员可以选择名称,则必须在语言中使用某种额外的语句或function来处理它。 会得到什么? 可以说我们会变得更糟:然后当你想要找到这个函数时,你首先必须找到它所谓的内容,然后你必须寻找函数本身,所以会有两个步骤而不是一个。
鉴于它将具有固定名称,有人必须选择该名称。 人们可以想到许多候选人:“开始”,“奔跑”,等等。 我怀疑为什么选择“主要”是有任何压倒一切的原因。 有人不得不选择一些东西,这是一个很好的选择。
有时最好不要仅仅为了改变它而改变一些东西。
不幸的是,我无法(还)直接发表评论,所以我必须在不知道你的问题答案的情况下给出一个完整的答案。
但是,我想指出所有人都说’除了主要()之外还应该成为什么呢? 确实根本不需要命名函数。 它很可能是{}
的惯例,这些匿名括号内的代码是主要function,就是这样。 (因此,当缺少返回类型时,它不仅暗示了int
,而且还意味着在缺少函数名时使用main()
。)
因为它和其他任何一样好。 另一种方法是使用一个未命名的块,如Pascal及其衍生词,或者在大多数脚本语言中,“main函数”(如果允许这样调用它)只是文件的开头。 然后,您必须关心从哪里获得程序参数(某些库或全局变量),您可以问为什么他们选择了args
而不是arguments
或argv
或param
等。
真诚地,我从未想过有人会关心那几乎无关的传统主义xD
如果您开发嵌入式系统,您可能会看到其他名称。
ECos使用
cyg_user_start().
(或main(),具体取决于设置)。
Linux内核模块使用标有__init的函数(虽然这不是一回事,因为模块通常是事件驱动的)。
因为C,C ++和Java需要一种方法来知道主要function在哪里……
但是,许多其他语言允许它以您喜欢的方式命名,并且有办法告诉编译器哪个函数是入口点(编译器选项,编译指示,特殊语句……)。