1

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

4

7 回答 7

1

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

标准 C 库包含一个函数,该函数设置初始环境(collectsargcargv)并调用您的main函数。

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

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

于 2012-06-19T18:11:52.493 回答
1

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

于 2012-06-19T18:09:04.713 回答
0

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) 的系统上运行和运行的绑定合同。因此,供应商有责任允许引导代码查找此特定功能,而程序员有责任提供合适的定义。

于 2012-06-19T18:22:43.970 回答
0

在c中定义了main函数,它是在编译器中定义的还是在头文件中定义的

(免责声明:Windows 有色描述)

该函数main是 C 标准的一部分,通常是程序的起点,不需要特殊的头文件。“main”这个名字对操作系统来说并没有真正的意义,相反,链接器默认将 main 设置为程序的起点,但这个名字实际上可以是程序中的任何其他函数。

链接器可以选择在程序中指定另一个入口点,它只是程序开始执行的起点,但无论是调用 main、_tmain 还是 WinMain 都无关紧要——从操作系统的角度来看。

于 2012-06-19T18:46:38.263 回答
0

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

  1. 操作系统粘合代码
  2. 程序员编写的应用程序(包括主程序)

运行时生成的应用程序执行 OS 粘合代码,然后调用函数 main。因此,当编译器为应用程序生成代码时,如果找不到函数 main 将无法编译。如果它找到它,那么它就知道它的地址,从而知道如何调用它。

main 并没有什么特别之处(除了编译器会寻找它)。

于 2012-06-19T18:10:29.033 回答
0

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

于 2012-06-19T18:18:09.980 回答
0

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

于 2012-06-19T18:08:15.433 回答