为什么名称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()更改为更酷的东西?

快速回答:

  1. 为什么不?
  2. 为什么改变它? 要什么?
  3. 因为它是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而不是argumentsargvparam等。

真诚地,我从未想过有人会关心那几乎无关的传统主义xD

如果您开发嵌入式系统,您可能会看到其他名称。

ECos使用

 cyg_user_start(). 

(或main(),具体取决于设置)。

Linux内核模块使用标有__init的函数(虽然这不是一回事,因为模块通常是事件驱动的)。

因为C,C ++和Java需要一种方法来知道主要function在哪里……

但是,许多其他语言允许它以您喜欢的方式命名,并且有办法告诉编译器哪个函数是入口点(编译器选项,编译指示,特殊语句……)。