从我读过的有关C和C ++的书中我了解到C程序中的入口必须是主要的。到目前为止我只创建了控制台应用程序,现在我开始学习Windows应用程序。所以我的问题是:
为什么Win32项目中的入口点不是主要的(但是WinMain)以及如何才能有所不同(可能主要调用WinMain?)?
PS。抱歉英文不好
答案 0 :(得分:4)
C ++确实需要main
成为"入口点"该计划,至少在所谓的“托管实施”和#34; (你可能正在使用的那些)。如果您忘记定义main
。
然而,在实践中,程序结束的差距和"运行时"开始,让事情看起来更加毛茸茸 - 当你的程序启动时,调用的第一个函数实际上是在运行时内,最终会调用main
。实际上,如果您忘记定义main
,则会导致链接器错误。
Microsoft决定,对于Windows GUI程序,不是调用main
,而是运行时将调用WinMain
。因此,您必须为要查找的函数WinMain
定义,而不是main
。从技术上讲,这违反了C ++标准,但它起作用,因为微软使它有效。
答案 1 :(得分:2)
代码中入口点的实际名称和签名由您决定在EXE中使用的运行时框架决定。
当OS执行EXE时,它首先调用链接器在EXE头中指定的入口点,并且通常位于编译器供应商的运行时库中。
运行时库的入口点初始化库,设置全局变量等,然后最终调用代码必须实现的入口点(运行时库包含对外部入口点的引用,并且链接器连接代码的进入该参考点。)
因此,代码的入口点是运行时库所要求的。 C / C ++中控制台应用程序的标准入口点为main
,Windows GUI应用程序的传统入口点为WinMain
。但就操作系统而言,这不是一项要求。
答案 2 :(得分:1)
事实上,main
只是汇编语言的名称:您可以随意声明Entry Point
,例如:
.code
START:
ret
END START
但是在C ++中它不允许你定义自己的EP。所以必须实现约定:对于控制台,你需要main,wmain,win32:WinMain,对于Dll:dllmain ......