Win32 控制台应用程序的正确入口点是什么?

Var*_*leX 5 c++ unicode winapi

我目前正在开发 Windows 10 的控制台应用程序,并且想知道 main() 入口点应该是什么。

Jeffrey Richter 和 Christophe Nasarre 的“Windows via C/C++”(2007) 第 69 页中指出:

您的 Windows 应用程序必须具有入口点函数...作为 C/C++ 开发人员,您可以使用两种可能的入口点函数:

int WINAPI _tWinMain(HINSTANCE hInstanceExe, HINSTANCE, PTSTR pszCmdLine, int nCmdShow);

int _tmain(int argv, TCHAR *argv[], TCHAR *envp[]);
Run Code Online (Sandbox Code Playgroud)

本书接着指出,这两个入口点实际上由编译器映射到不同的入口点,具体取决于应用程序是 GUI 还是控制台以及是否使用 Unicode。

我想使用 Unicode 的 Win32 控制台应用程序使用正确的入口点,所以我假设(?),我想要 _tmain 版本,但是当我在 Visual Studio 2015 Community Edition 中打开一个新项目并选择“Win32 控制台应用程序”时”,然后选择“控制台应用程序”,我最终得到了 main() 就像我在 Linux 下习惯的那样:

int main()
Run Code Online (Sandbox Code Playgroud)

我应该使用哪个入口点?

jim*_*imc -2

第一个入口点(或变体)通常用于 GUI 进程:

int WINAPI _tWinMain(HINSTANCE hInstanceExe, HINSTANCE, PTSTR pszCmdLine, int nCmdShow);
Run Code Online (Sandbox Code Playgroud)

第二个入口点(或变体)通常用于命令行进程:

int _tmain(int argv, TCHAR *argv[], TCHAR *envp[]);
Run Code Online (Sandbox Code Playgroud)

入口点是使用 /ENTRY 链接器选项设置的。当您创建 GUI/控制台项目时,Visual Studio 会为您设置此项,并且通常不需要更改它。请参阅:https ://msdn.microsoft.com/en-us/library/f9t8842e.aspx

_T 前缀通常在使用 tchar.h 时使用。这使得应用程序(理论上)可以轻松编译为“Ansi”或 Unicode。您可以在之前的回答中阅读更多相关内容:

C++ 中 _tmain() 和 main() 有什么区别?