在c中定义的主函数是在编译器或头文件中定义的,编译器如何知道“主”字的含义?我无法在任何地方得到答案,请帮助。
答案 0 :(得分:1)
通常,操作系统定义一个入口点(在Unix上,它通常是start
函数),它由操作系统(特别是加载器)自动调用。您的C编译器提供了最小的运行时设置(再次,在Unix上,它很可能称为crt0.o
),它是一个预编译的目标文件,它设置C库内部,然后调用main()函数。所以编译器与它无关;它是crt0.o和完成工作的操作系统。
答案 1 :(得分:1)
它的定义都没有。 main
实际上并不是C中的关键字 - 它只是一个常规函数。
标准C库包含一个功能,用于设置初始环境(收集argc
,argv
等)并调用您的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生成应用程序时,代码有两个主要部分:
运行时生成的应用程序执行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无关紧要 - 从它的角度来看操作系统。