为什么名称main为函数main()

时间:2009-11-06 15:33:07

标签: java c main

为什么函数名main()保留在许多语言中,如C,C ++,Java?为什么没有该功能的任何其他名称?所有这三个main()(在C,C ++,Java中)是否有任何共同的结构

18 个答案:

答案 0 :(得分:31)

对于一个合法的问题,这里有很多愚蠢而不是非常尊重的答案。

C并非来自nowhere。它的直接祖先是B,由Ken Thompson编写。这是B manual的链接。 B程序的基本结构是

主();出口();

main()由程序员提供,exit()由库提供。这似乎是main()的第一次出现,因为B的前身BCPL没有这样的概念。我猜你肯定要问Ken Thompson为什么它是主要而不是别的。

答案 1 :(得分:26)

另请注意,虽然名称main是各种约定,但您可以随意命名您的输入函数,只要您告诉链接器入口点实际上是什么 。请参阅man ld中的此片段:

       -e entry
       --entry=entry
       Use  entry  as  the explicit symbol for beginning execution of your
       program, rather than the default entry point.  If there is no  sym-
       bol  named  entry,  the linker will try to parse entry as a number,
       and use that as the entry address (the number will  be  interpreted
       in  base  10;  you may use a leading 0x for base 16, or a leading 0
       for base 8).

此外,FWIW,ld的{​​{3}}(有时)是一个实际上称为_start的函数(但我认为它实际上是一个与平台相关的值)。

请参阅first choice of entry point,为ld的{​​{1}}选项添加更多解释:

  

-e代替-e,而不是_start。你必须知道   系统运行时如何将参数传递给程序并复制   crt [01in] .o和crt {begin,end} .o的一些功能来调用   主


我无法找到gcc手册页中记录的位置,但您也可以将main()传递给gcc以指定入口点;然而,当你解决C -e的魔力时,它最终会成为一项相当复杂的任务。

$ cat junk.c
int junk()
{
        return 8;
}

$ gcc -nostdlib -e _junk junk.c -o junk && (./junk; echo $?)
8

答案 2 :(得分:10)

因为C做到了,所以C ++保持兼容,而Java则是为了简化从C ++的过渡。早在Java的早期,雇主经常聘请具有C ++经验的人,因为它非常相似。不像今天他们希望新人拥有比Gosling更多的Java经验。

并且不要忘记PL / 1为了相同的目的使用了“程序选项主”。 (伙计,那让人兴奋的一些记忆细胞一段时间没有被触及!)

答案 3 :(得分:9)

您如何命名程序的主要功能?

答案 4 :(得分:8)

或者,为了更加迟钝,我们为什么要在路边开车呢?

答案:我们必须选择一些东西。

答案 5 :(得分:6)

并不总是主()。

Java Applet使用init()和start()来连接外部调用者。

Servlet通过init()和service()方法启动。

(服务将调度到更熟悉的doGet和doPost方法)

当然,这些异常确实依赖于操作系统以外的某些容器来调用方法。

答案 6 :(得分:4)

更有趣的问题是......

你接近一些几乎有趣的问题......

  • main语言或图书馆的一部分吗?
  • 我的程序是如何开始的?
  • main()之前运行了什么?
  • 使用main()的第一种语言是什么?
  • 我可以编写一个不使用库的程序吗?是否需要main()
  • 当我从main()返回时会发生什么?
  • 给女孩留下深刻印象,我怎样才能将名字从main()改为更酷的东西?

答案 7 :(得分:3)

快速回答:

  1. 为什么不呢?
  2. 为什么要改变它?到底是什么?
  3. 因为它是C,C ++和Java都具有共同祖先的症状之一(具体而言,C对其他两个影响很大)。例如,你不会在Scheme或Prolog中看到main()。
  4. 就我个人而言,我认为问题2a和2b的答案是最重要的。如果你真的想打破世界上的每一个C / C ++ / Java程序,以便修复你认为单个函数名称有缺陷的美学,我将不得不问你是否有你的优先顺序.... - )

答案 8 :(得分:3)

因为它是主要功能。术语主要功能至少从20世纪60年代开始使用。在PL / I中,开始执行的函数具有以下标题:

 FOO: PROCEDURE OPTIONS(MAIN);

其中FOO是函数名称。

答案 9 :(得分:2)

你必须说出一些东西。我想不出更好的名字,因为那是主要程序流程开始的地方。

除了获取参数的能力之外,没有共同的结构。也不应该有一个共同的结构,因为程序的重点是做程序员想要的任何事情。即,任何事情。

答案 10 :(得分:2)

语言设计者必须选择“某些”名称和main()听起来像Main函数,因为这是执行开始的地方:)

答案 11 :(得分:2)

好吧,它要么必须有一个固定的名称,要么你必须给程序员一个指定名称的方法。

如果程序员可以选择名称,那么语言中必须有一些额外的语句或功能才能处理。会得到什么?可以说我们的情况会更糟:然后当你想要找到这个函数时,你首先必须寻找说它叫什么的东西,然后你必须寻找函数本身,所以会有两个步骤而不是一步。

鉴于它将具有固定名称,有人必须选择该名称。人们可以想到很多候选人:“开始”,“跑”,等等。我怀疑选择“主要”是否有任何压倒一切的理由。有人不得不选择一些东西,这是一个很好的选择。

答案 12 :(得分:2)

可能是因为它是必须运行的主要功能。 C ++从C继承了名称,Java从C ++继承了它(程序员不喜欢改变)。

答案 13 :(得分:1)

有时最好不要仅仅为了改变它而改变一些东西。

答案 14 :(得分:1)

不幸的是,我无法直接发表评论,所以我不得不在完全回答问题的情况下给出完整答案。

但是,但是,我想向所有人说“除了 main()以外还应该成为什么?”确实不需要命名函数一点都不它可能是{}的惯例,这些匿名括号内的代码是主要功能,就是这样。 (因此,当缺少返回类型时,它不仅暗示int,而且还意味着在缺少函数名时说main()。)

答案 15 :(得分:0)

因为它和其他任何一样好。另一种方法是使用一个未命名的块,如在Pascal及其派生词中,或者在大多数脚本语言中,“main函数”(如果允许这样调用它)只是文件的开头。然后,您必须关心从哪里获得程序参数(某些库或全局变量),您可以问他们为什么选择args而不是argumentsargv或{{1等等。

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

答案 16 :(得分:0)

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

ECos使用

cyg_user_start().  

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

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

答案 17 :(得分:-1)

因为C,C ++和Java需要一种方法来了解主函数的位置......

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