哪个是关于存储在c中的“main”函数的信息,其中主要定义了?

时间:2012-06-19 18:05:48

标签: c

在c中定义的主函数是在编译器或头文件中定义的,编译器如何知道“主”字的含义?我无法在任何地方得到答案,请帮助。

7 个答案:

答案 0 :(得分:1)

通常,操作系统定义一个入口点(在Unix上,它通常是start函数),它由操作系统(特别是加载器)自动调用。您的C编译器提供了最小的运行时设置(再次,在Unix上,它很可能称为crt0.o),它是一个预编译的目标文件,它设置C库内部,然后调用main()函数。所以编译器与它无关;它是crt0.o和完成工作的操作系统。

答案 1 :(得分:1)

它的定义都没有。 main实际上并不是C中的关键字 - 它只是一个常规函数。

标准C库包含一个功能,用于设置初始环境(收集argcargv等)并调用您的main函数。

然后,链接器将该函数的位置作为入口点放在目标文件中。

您可以在此处查看glibc的切入点: http://fossies.org/dox/glibc-2.15/dl-init_8c_source.html

答案 2 :(得分:1)

C允许两种不同类型的执行环境:独立托管。参考 5.1.2 / 1:

  

定义了两个执行环境:独立和托管。在这两种情况下,   程序启动发生在执行调用指定的C函数时   环境。

然而:

  

这种初始化的方式和时间是   否则未指明。程序终止将控制权返回给执行   环境。

在5.1.2.1/1的独立环境中(想想嵌入式系统):

  

在独立环境中(C程序执行可能在没有任何情况下执行)   操作系统的好处),程序调用的函数的名称和类型   启动是实现定义的。

大多数(桌面)公共系统属于托管类别,即存在主机或操作系统的系统,该主机或操作系统为程序运行提供上下文。在这种环境中(见5.1.2.2.1 / 1):

  

程序启动时调用的函数名为main。

main不是关键字(即不在6.4.1定义的集合中)。可以将其视为C程序的绑定合同,以便从具有主机(OS)的系统运行并运行。因此,供应商有责任允许引导代码查找此特定函数,并且程序员有责任提供合适的定义。

答案 3 :(得分:0)

main函数的含义是语言规范的一部分 编译器有特殊代码来处理它。

答案 4 :(得分:0)

当copiler生成应用程序时,代码有两个主要部分:

  1. 操作系统胶水代码
  2. 程序员编写的应用程序(包括main)
  3. 运行时生成的应用程序执行OS胶水代码然后调用函数main。因此,当编译器为应用程序生成代码时,如果找不到函数main将无法编译。如果它找到它,那么它知道它的地址,从而知道如何调用它。

    除了编译器寻找它之外,还没有其他特别之处(。除了编译器寻找它)。

答案 5 :(得分:0)

Call stack存储计算机程序的活动子程序的信息。因为,Main()函数已经由编译器定义。因此,它应该存储在类似于调用堆栈的数据结构中。请看这个链接      http://en.wikipedia.org/wiki/Call_stack 希望这会有所帮助。

答案 6 :(得分:0)

  

在c中定义的主要函数是在编译器中定义的   在头文件中

(免责声明:windows着色描述)

函数main是C标准的一部分,通常是程序的起点,不需要特殊的标题。名称“main”对操作系统并没有什么重要意义,相反,链接器默认将main设置为程序的起始点,但名称实际上可能是程序中的任何其他功能。

链接器可以选择在程序中指定另一个入口点,它只是程序开始执行的起始点,但它是否被称为main,_tmain或WinMain无关紧要 - 从它的角度来看操作系统。