10

我对 C++ 还很陌生,但之前做过一些 .NET 编程。

main(...)和之间有什么区别WinMain(...),我之前编写了一个程序,main(...)并且能够像我一样很好地调用 Win32 函数WinMain(...),所以这让我问“最好在哪里使用一个而不是另一个,或者它甚至做出改变?”

4

2 回答 2

22

谈到微软工具链,传统上,Win32图形应用程序总是以 开头WinMain,而main用于控制台应用程序。

两种应用程序之间的区别实际上(主要)归结为可执行文件中的一个设置,而不是能力- GUI 应用程序可以创建控制台,控制台应用程序可以创建窗口 - 但在行为加载程序:对于标记为 GUI 的 exe,加载程序不会分配任何控制台,而控制台 exe 将附加到父控制台或创建一个新控制台(如果没有控制台)。

对于入口点名称,这只是链接器/CRT 默认值的问题:可执行文件的“真实”入口点只是最终可执行文件的偏移量,它指向一个不带参数的函数。是 CRT 完成它的工作,确定参数,然后调用“你的”入口点,因此,原则上,它们都可以以完全相同的方式工作。

关键是,CRT 查找的默认入口点的名称/签名取决于您正在构建的应用程序的类型;如果编译器和链接器设置为构建控制台应用程序,它们将查找main(或wmain_tmain,取决于 Unicode 设置)、它们使用的 GUI 应用程序WinMainDllMaindll。


所以:

  • WinMain如果您正在构建 GUI(=在启动时没有为其创建控制台)应用程序,请使用;
  • main对于控制台应用程序;
  • DllMain对于一个dll。

同样,这一切都不是一成不变的(并且有一些方法可以从标准启动 GUI 应用程序main),而是“在罗马时,像罗马人那样做”——即通常最好遵循平台的使用来避免混淆其他开发人员并通过未经测试/不受支持的编译器设置来更改入口点的签名。

于 2013-09-10T01:29:45.897 回答
2

WinMain()是基于 Windows 的图形应用程序的 Windows 特定入口点(你有 Windows 的东西)。main()是一个标准的 C++ 入口点(在 Windows 中,它是一个基于控制台的应用程序).​​..

也就是说,您可以在控制台应用程序中使用 GUI 的东西并在 GUI 应用程序中分配控制台。

我建议阅读MSDN 上 Windows 中的控制台GUI 应用程序。

于 2013-09-10T01:28:08.990 回答