WinMain与main的区别(C++)

13

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

main(...)WinMain(...)有什么区别?我之前用main(...)写了一个程序,并且可以像使用WinMain(...)一样成功调用Win32函数。这让我想知道:“在哪种情况下更适合使用其中的一个,或者它们有没有区别?”


6
一般来说,WinMain() 用于 GUI 应用程序,main() 用于控制台应用程序。 - Jonathan Potter
2个回答

27
谈到微软工具链,传统上,Win32图形应用程序始终以WinMain开头,而main用于控制台应用程序。
这两种应用程序之间的区别实际上归结于可执行文件中的单个设置,并不在于它们的能力-图形界面应用程序可以创建控制台,控制台应用程序也可以创建窗口-但在加载程序的行为方面:对于标记为GUI的exe,加载程序不会分配任何控制台,而控制台exe将连接到父控制台或在没有控制台的情况下创建一个新控制台。
对于入口点名称,这只是链接器/CRT默认值的问题:可执行文件的“真正”入口点只是指向一个不带参数的函数的最终可执行文件中的偏移量。CRT会执行其任务,确定参数,然后调用“您”的入口点,因此原则上,它们都可以完全相同地工作。
重点是,CRT寻找的默认入口点的名称/签名取决于您正在构建的应用程序类型;如果编译器和链接器设置为构建控制台应用程序,则它们将寻找main(或wmain_tmain,取决于Unicode设置),对于GUI应用程序,它们使用WinMain,并对于dll使用DllMain
因此:
- 如果要构建GUI(在启动时不创建控制台)应用程序,请使用WinMain; - 对于控制台应用程序,请使用main; - 对于dll,请使用DllMain

再次提醒,这并不是一成不变的规定(而且有方法可以从标准的main函数启动GUI应用程序),但是“入乡随俗”——即通常最好遵循平台的用法,以避免混淆其他开发者,并经历未经测试/不受支持的编译器设置来更改入口点的签名。


值得一提的是,可执行文件的“真正”入口点只是最终可执行文件中的一个偏移量,指向一个不带参数的函数。这个函数通常被称为_start - Cole Tobin
@ColeJohnson:在Linux上肯定没问题(我写过好几个),不过在Win32上也是这样吗? - Matteo Italia
在Windows上,它通常被称为mainCRTStartup - Cole Tobin

2

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

也就是说,在控制台应用程序中可以使用GUI工具,并在GUI应用程序中分配控制台。

我建议在MSDN上阅读有关Windows中的控制台GUI应用程序的内容。


这只是传统惯例而已,没有什么阻止基于控制台的应用程序创建GUI,也没有什么阻止GUI应用程序创建控制台(正如Matteo Italia的答案中所提到的)。 - dreamlax
2
@dreamlax 我引用一下:“_话虽如此,在控制台应用程序中可以使用GUI组件,在GUI应用程序中也可以分配控制台_”。 - lapk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接