我知道C / C ++中使用的main()方法& Java,但由于main()是用户定义的(因为main()中的代码是由用户定义的,它不能是预定义的方法)&在C / C ++中,main不存储在头文件中,那么它在哪里准确定位,以便编译器首先在程序中搜索它?主要是关键字还是其他什么?我听说它是一个用作关键字的属性,但我不确定。有人可以帮我这个吗? (我想在Java& C / C ++的情况下了解这一点)
答案 0 :(得分:4)
main
未预定义,但 预先声明。在C中,您的代码链接到一个小的运行时库,该库构成程序的 true 起点。正是这个小型库完成了最少量的堆栈设置,然后调用了一个名为main
的函数 - 它是硬编码的。您的代码运行是因为您提供了main
的定义。
Java运行时执行类似的操作:虚拟机中的引导代码将调用作为输入提供的任何类的main
方法。
答案 1 :(得分:1)
Main不是Java中的关键字。当您尝试使用“java”命令执行Java代码时,运行时将加载您尝试执行的公共类,然后调用类中定义的main方法。运行时知道“main”是要查找的方法,因为它是以这种方式设计的。语言规范还要求应该有一个名为“main”的方法,该方法应该是public和static,并接受一个字符串数组作为参数,返回类型为void。由于它是public和static,因此运行时可以调用该方法而无需实例化Class。
答案 2 :(得分:0)
<强> C ++ 11 强>
只是引用标准:
3.6.1主要功能
程序应包含一个名为main的全局函数,即 指定的程序开始。它是实现定义的 需要在独立环境中定义主程序 功能。 [注意:在独立的环境中,启动和 终止是实现定义的;启动包含 使用static执行命名空间作用域对象的构造函数 储存期限;终止包含析构函数的执行 对于具有静态存储持续时间的对 - 结束说明]
实现不应预定义主函数。这个功能 不得超载。它应该具有int类型的返回类型,但是 否则其类型是实现定义的。所有实施 应允许以下两个主要定义:
int main(){/ * ... /}和int main(int argc,char argv []){/ * ... * /}
在后一种形式中,argc应该是传递给的参数的数量 来自运行程序的环境中的程序。如果argc是 非零这些参数应在argv [0]中提供 argv [argc-1]作为指向null终止的初始字符的指针 多字节字符串(ntmbs s)(17.5.2.1.4.2)和argv [0]应为 指向表示名称的ntmbs的初始字符的指针 用来调用程序或“”。 argc的值应为 非负。 argv [argc]的值应为0. [注意:它是 建议在之后添加任何其他(可选)参数 argv的。 - 结束说明]
函数main不得在程序中使用。联系 (3.5)main是实现定义的。定义主要的程序 删除或声明main为inline,static或constexpr 形象不对。名称main不以其他方式保留。 [例如: 成员函数,类和枚举可以称为main,也可以 其他名称空间中的实体。 - 结束例子]
在不离开当前块的情况下终止程序(例如,通过 调用函数std :: exit(int)(18.5))不会破坏任何函数 具有自动存储持续时间的对象(12.4)。如果调用std :: exit 在使用static或者销毁对象期间结束程序 线程存储持续时间,程序有未定义的行为。
main中的return语句具有离开main函数的效果 (销毁具有自动存储持续时间的任何对象)并调用 std :: exit,返回值作为参数。如果控制到达 main的结尾没有遇到return语句,效果是 执行返回0;