为什么函数名main()保留在许多语言中,如C,C ++,Java?为什么没有该功能的任何其他名称?所有这三个main()(在C,C ++,Java中)是否有任何共同的结构
答案 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()
改为更酷的东西?答案 7 :(得分:3)
快速回答:
就我个人而言,我认为问题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
而不是arguments
或argv
或{{1等等。
真诚地,我从未想过有人会关心那几乎无关的传统主义xD
答案 16 :(得分:0)
如果您开发嵌入式系统,您可能会看到其他名称。
ECos使用
cyg_user_start().
(或main(),具体取决于设置)。
Linux内核模块使用标有__init的函数(虽然这不是一回事,因为模块通常是事件驱动的。)
答案 17 :(得分:-1)
因为C,C ++和Java需要一种方法来了解主函数的位置......
然而,许多其他语言允许它以您喜欢的方式命名,并且有办法告诉编译器哪个函数是入口点(编译器选项,编译指示,特殊语句......)。