【发布时间】:2016-11-16 18:51:32
【问题描述】:
我目前正在开发适用于 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[]);
这本书接着确定这两个入口点实际上是由编译器映射到不同的入口点,这取决于应用程序是 GUI 还是控制台以及是否使用 Unicode。
我想为使用 Unicode 的 Win32 控制台应用程序使用正确的入口点,所以我假设(?),我想要 _tmain 版本,但是当我在 Visual Studio 2015 社区版中打开一个新项目并选择“ Win32 控制台应用程序”,然后选择“控制台应用程序”,我最终得到了 main(),就像我在 Linux 下习惯的那样:
int main()
我应该使用哪个入口点?
【问题讨论】:
-
我会使用
wmain并避免像瘟疫一样使用TCHAR。 stackoverflow.com/questions/2438049/… -
TCHAR理论上允许你编译为 ansi 或 unicode。在实践中,你要么永远不会同时编译,要么如果你这样做,它就不是你唯一需要改变的事情了。 -
如果您无法使用
main()而不是wmain(),您仍然可以在控制台应用程序中使用GetCommandLineW()和CommandLineToArgvW()来获取Unicode 命令行参数。 -
“这本书继续确定这两个入口点实际上是由编译器映射到不同的入口点” - 这是在 crt0.c,一个 CRT 实现文件,在 2013 年之前与 Visual Studio 一起发布。它包含推断用户提供的入口点的所有逻辑,以及许多有用的 cmets。不幸的是,VS 2015 中缺少此文件。
-
@IInspectable -
mcrtexe.cpp(靠近第 152 行)具有与crt0.c相同的关于入口点的块注释。我没有追踪所有逻辑来查看它们是否匹配,但它们看起来很相似。 (顺便mcrtexe.cpp顶部的注释调用文件crtexe.c)