我们可以将该wmain()
函数与 Unix 编译器一起使用,还是仅适用于 Windows?
4 回答
唯一的标准签名main
是:
int main(void);
int main(int argc, char *argv[]);
但是,独立的实现可以提供扩展/允许其他签名。但这些并不能保证是便携的。wmain
看起来像 Windows/VS 的东西。这在 *nix/GNU GCC 上运行的可能性不大。
wmain
Windows 中存在用于处理宽字符命令行参数的签名。通常,虽然 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[]);
您也可以使用
_tmain
tchar.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 等效项是什么?
也可以看看