【发布时间】:2011-01-27 03:42:03
【问题描述】:
我们能否在 Unix 编译器中使用 wmain() 函数,或者它仅适用于 Windows?
【问题讨论】:
标签: c++ c unix widestring wmain
我们能否在 Unix 编译器中使用 wmain() 函数,或者它仅适用于 Windows?
【问题讨论】:
标签: c++ c unix widestring wmain
main 的唯一标准签名是:
int main(void);
int main(int argc, char *argv[]);
但是,独立的实现可以提供扩展/允许其他签名。但这些并不保证是便携的。 wmain 看起来像 Windows/VS 的东西。这在 *nix/GNU GCC 上运行的可能性不大。
【讨论】:
wmain() 是特定于 Windows 的。就像_tmain,如果这很重要的话......
【讨论】:
wmain 签名存在于 Windows 中,用于处理宽字符命令行参数。通常,虽然 Windows 应用程序更喜欢 UTF16,但 Unix 应用程序更喜欢 UTF8 进行 Unicode 字符串编码。 UTF8 使用常规的char 字符串,因此标准的main 签名足以用于支持Unicode 的Unix 应用程序。
如果您想制作一个不需要 Unicode 命令行参数的便携式控制台应用程序,请使用main。如果您确实需要 Unicode 命令行参数,那么您需要预处理器指令来启用适合每个环境的签名。
如果您要制作跨平台的 GUI 应用程序,请使用特殊的框架,例如 Qt。
【讨论】:
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[]);您也可以使用在 tchar.h 中定义的
_tmain。_tmain解析为main,除非定义了_UNICODE。在这种情况下,_tmain解析为wmain。
它的主要目的是获取文件名等Unicode参数。但是它非常没用,大多数人实际上并没有使用它,因为您只需调用 GetCommandLineW() 和 CommandLineToArgvW() 即可获得相同的东西,而无需对 main 的签名进行任何更改
为了可移植性,您可以使用Boost.Nowide,以便所有内容都使用UTF-8。较新的 Windows 10 和 MSVC 的标准库还支持将 UTF-8 设置为活动代码页,您可以使用 GetCommandLineA 或有时使用普通的 main 获取 Unicode 参数。见What is the Windows equivalent for en_US.UTF-8 locale?
另见
【讨论】: