主存储在哪里?主要是一个关键字?我知道main()是一个方法,但我问的是“主”

时间:2014-03-24 16:00:10

标签: java c++ c

我知道C / C ++中使用的main()方法& Java,但由于main()是用户定义的(因为main()中的代码是由用户定义的,它不能是预定义的方法)&在C / C ++中,main不存储在头文件中,那么它在哪里准确定位,以便编译器首先在程序中搜索它?主要是关键字还是其他什么?我听说它是​​一个用作关键字的属性,但我不确定。有人可以帮我这个吗? (我想在Java& C / C ++的情况下了解这一点)

3 个答案:

答案 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;