我们可以将该wmain()函数与 Unix 编译器一起使用,还是仅适用于 Windows?
4 回答
唯一的标准签名main是:
int main(void);
int main(int argc, char *argv[]);
但是,独立的实现可以提供扩展/允许其他签名。但这些并不能保证是便携的。wmain看起来像 Windows/VS 的东西。这在 *nix/GNU GCC 上运行的可能性不大。
wmainWindows 中存在用于处理宽字符命令行参数的签名。通常,虽然 Windows 应用程序更喜欢 UTF16,但 Unix 应用程序更喜欢 UTF8 进行 Unicode 字符串编码。UTF8 使用常规char字符串,因此标准main签名对于支持 Unicode 的 Unix 应用程序来说已经足够了。
如果要制作不需要 Unicode 命令行参数的便携式控制台应用程序,请使用main. 如果您确实需要 Unicode 命令行参数,那么您需要预处理器指令来启用适合每个环境的签名。
如果您正在制作一个跨平台的 GUI 应用程序,请使用一个特殊的框架,例如 Qt。
wmain()是特定于 Windows 的。就像_tmain,如果这很重要...
唯一的标准形式main是
int main(void) { /* ... */ } int main(int argc, char *argv[]) { /* ... */ }
其他都是非标准的。如果您阅读 MS 的文档,您会看到该文档wmain位于Microsoft 特定部分:
微软特定
如果您的源文件使用 Unicode 宽字符,您可以使用
wmain,这是 main 的宽字符版本。wmain 的声明语法如下:int wmain( ); int wmain(int argc, wchar_t *argv[], wchar_t *envp[]);您也可以使用
_tmaintchar.h 中定义的 。_tmain解析为main除非_UNICODE已定义。在这种情况下,_tmain解析为wmain。
它的主要目的是获取文件名等Unicode参数。然而它非常没用,大多数人实际上并没有使用它,因为你可以调用GetCommandLineW()并CommandLineToArgvW()获得相同的东西,而不需要对 main 的签名进行任何更改
为了可移植性,您可以使用Boost.Nowide,以便所有内容都使用 UTF-8。较新的 Windows 10 和 MSVC 的标准库还支持将 UTF-8 设置为活动代码页,您可以使用GetCommandLineA或有时使用普通的main. 请参阅en_US.UTF-8 语言环境的 Windows 等效项是什么?
也可以看看