在c中,main函数在哪里定义,是在编译器中定义还是在头文件中定义,编译器如何知道“main”字的含义?我无法在任何地方得到答案,请帮助。
7 回答
两者都没有定义。main
实际上不是 C 中的关键字 - 它只是一个常规函数。
标准 C 库包含一个函数,该函数设置初始环境(collectsargc
等argv
)并调用您的main
函数。
然后链接器将该函数的位置作为入口点放在目标文件中。
您可以在此处查看glibc
的入口点:http:
//fossies.org/dox/glibc-2.15/dl-init_8c_source.html
通常,操作系统定义了一个入口点(在 Unix 上,它通常是start
函数),由操作系统(特别是加载程序)自动调用。你的 C 编译器提供了一个最小的运行时设置(同样,在 Unix 上,它很可能被称为crt0.o
),它是一个预编译的目标文件,它设置 C 库内部然后调用你的 main() 函数。所以编译器与它无关;它是 crt0.o 和完成这项工作的操作系统。
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) 的系统上运行和运行的绑定合同。因此,供应商有责任允许引导代码查找此特定功能,而程序员有责任提供合适的定义。
在c中定义了main函数,它是在编译器中定义的还是在头文件中定义的
(免责声明:Windows 有色描述)
该函数main
是 C 标准的一部分,通常是程序的起点,不需要特殊的头文件。“main”这个名字对操作系统来说并没有真正的意义,相反,链接器默认将 main 设置为程序的起点,但这个名字实际上可以是程序中的任何其他函数。
链接器可以选择在程序中指定另一个入口点,它只是程序开始执行的起点,但无论是调用 main、_tmain 还是 WinMain 都无关紧要——从操作系统的角度来看。
当编译器生成应用程序时,代码有两个主要部分:
- 操作系统粘合代码
- 程序员编写的应用程序(包括主程序)
运行时生成的应用程序执行 OS 粘合代码,然后调用函数 main。因此,当编译器为应用程序生成代码时,如果找不到函数 main 将无法编译。如果它找到它,那么它就知道它的地址,从而知道如何调用它。
main 并没有什么特别之处(除了编译器会寻找它)。
Call stack
存储计算机程序的活动子程序的信息。由于 Main() 函数已经由编译器定义。因此,它应该存储在类似于调用堆栈的数据结构中。请查看此链接
http://en.wikipedia。 org/wiki/Call_stack
希望这会有所帮助。
函数的含义main
是语言规范的一部分。
编译器有特殊的代码来处理它。