There is an article about entry point on MSDN其中包含有关使用 main()
而不是 WinMain()
的警告。
The CRT does some additional work inside main. For example, any static initializers are called before wWinMain. Although you can tell the linker to use a different entry-point function, use the default if you link to the CRT. Otherwise, the CRT initialization code will be skipped, with unpredictable results. (For example, global objects will not be initialized correctly.)
不幸的是,如果我在具有 Windows 子系统设置的应用程序中使用 main()
而不是 WinMain()
,我找不到任何关于到底是什么坏后果的信息.
有没有人能告诉我,或者我怎样才能自己找到它? 衷心感谢!
最佳答案
您不能真的相信该文档,main
不会调用 WinMain
。它试图警告的问题是当您使用/ENTRY 链接器开关覆盖 CRT 入口点函数时。如果您这样做,则 CRT 将无法正确初始化,并且可能不会调用构造函数。
在 Windows ABI 层,如果 IMAGE_OPTIONAL_HEADER.Subsystem设置为 IMAGE_SUBSYSTEM_WINDOWS_CUI
然后创建一个新的控制台/终端,除非父进程已经有一个控制台。 CreateProcess
的调用者可以使用 CREATE_NEW_CONSOLE
和其他标志覆盖它。
当进程启动时,Windows只是调用入口点函数(AddressOfEntryPoint
),这个函数没有任何参数。
使用 Microsoft 链接器时,此函数称为 mainCRTStartup
创建控制台应用程序时,WinMainCRTStartup
创建 GUI 应用程序时。如果您使用的是 C 运行时/CRT,那么这些函数会为您提供并分别调用 main
或 WinMain
。无论哪种方式,特殊魔法都在调用您的入口点函数之前执行。
允许控制台应用程序创建普通窗口,而 GUI 应用程序可以创建控制台 (AllocConsole
)。您选择哪种类型取决于您是否要为您创建控制台。如果您想将 stdout
与您手动创建的控制台相关联,则需要额外的工作。
我的建议是仅在控制台应用程序的代码中使用 main
,在 GUI 应用程序中使用 WinMain
,链接器和 CRT 将处理其余部分。
关于c++ - 在 Windows GUI 应用程序中使用 `main()` 而不是 `WinMain()` 时究竟会产生什么不良后果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42584364/