为什么许多语言(如C、C++和Java)都保留了函数名main()?为什么不使用其他名称来命名该函数?这三个main()函数是否有共同的结构(在C、C++和Java中)?
为什么许多语言(如C、C++和Java)都保留了函数名main()?为什么不使用其他名称来命名该函数?这三个main()函数是否有共同的结构(在C、C++和Java中)?
enter()
,作为exit()
的反义词。 - cafmain
是某种约定,但您可以为入口函数命名任何您想要的内容,只要告诉链接器实际的入口点是什么。请查看来自man ld
的此代码片段:
-e entry --entry=entry 将entry用作程序开始执行的显式符号,而不是默认的入口点。如果没有名为entry的符号, 链接器将尝试将entry解析为一个数字,并使用其作为入口地址(该数字将以基数10解释; 您可以在基数16的情况下使用前导0x,或在基数8的情况下使用前导0)。
另外,ld
的入口点的首选项(有时)也是一个名为_start
的函数(但我认为这实际上是一个因平台而异的值)。
请参见此邮件帖子,它对ld
的-e
选项进行了更详细的说明:
-e
指定了_start
的替代项,而不是main()
。您必须知道系统运行时如何将参数传递给程序并复制一些功能, 以调用主函数,包括crt[01in].o和crt{begin,end}.o的某些功能。
我找不到在gcc手册页中记录的位置,但您也可以向gcc传递-e
以指定入口点;然而,在绕过C的main
魔法时,这最终是一个相当复杂的任务。
$ cat junk.c```html junk() { 8; } $ gcc -nostdlib -e _junk junk.c -o junk && (./junk; $?) 8 ```
因为C语言这么做了,所以C++保留了它以保持兼容性,而Java则是为了简化从C++转换过来的操作。在Java的早期,雇主通常会聘请有C++经验的人,因为两者非常相似。与今天不同,现在他们希望新员工拥有比高斯林更多的Java经验。
不要忘记PL/1也使用“procedure options main”来实现同样的目的。(哇,这让我想起了很久以前没有碰过的记忆!)
并不总是main()。
Java Applets使用init()和start()作为外部调用者的钩子。
Servlet通过init()和service()方法启动。
(service将分派到更熟悉的doGet和doPost方法)
当然,这些异常确实依赖于某些容器而不是操作系统来调用这些方法。
因为这是主函数。术语“主函数”至少自20世纪60年代以来一直被使用。在PL/I中,启动执行的函数具有以下标题:
FOO: PROCEDURE OPTIONS(MAIN);
这里的 FOO
是函数名称。
快速回答:
就个人而言,我认为问题2a和2b的答案最重要。如果你真的想打破世界上每一个C/C++/Java程序,只为了修复你认为有缺陷的单个函数名称的美学,那我必须问你是否有正确的优先级.... ;-)
program()
、start()
、run()
... - R. Martinho Fernandes可能是因为这是必须要运行的主要函数。C++从C继承了这个名称,Java从C++继承了它(程序员不喜欢变化)。
你必须给它命名。我想不到更好的名称,因为那是主程序流程开始的地方。
除了可能具有接受参数的能力外,没有共同的结构。也不应该有共同的结构,因为程序的整个目的是做任何程序员想做的事情。
program()
?start()
? - R. Martinho Fernandesmain()
之外添加函数,但程序的主要流程(至少在 C 和 C++ 中)都在其中。 - Adriano Varoli Piazza
#define theNameOfTheThing main
来设置并使用。 - R. Martinho Fernandes