我们可以在Unix编译器中使用wmain()函数,还是只能在\ for Windows上使用?
答案 0 :(得分:10)
main
的唯一标准签名是:
int main(void);
int main(int argc, char *argv[]);
但是,独立实现可以提供扩展/允许其他签名。但那些便携设备并不保证。 wmain
看起来像Windows / VS的东西。这对于* nix / GNU GCC来说没有多大机会。
答案 1 :(得分:10)
Windows中存在wmain
签名,用于处理宽字符命令行参数。通常,虽然Windows应用程序更喜欢UTF16,但Unix应用程序更喜欢使用UTF8进行Unicode字符串编码。 UTF8使用常规char
字符串,因此标准main
签名足以支持Unicode识别的Unix应用程序。
如果要创建不需要Unicode命令行参数的可移植控制台应用程序,请使用main
。如果确实需要Unicode命令行参数,那么您需要预处理程序指令来启用适合每个环境的签名。
如果您正在制作跨平台GUI应用程序,请使用特殊框架,例如QT。
答案 2 :(得分:2)
wmain()是特定于Windows的。就像_tmain一样,如果重要的话......
答案 3 :(得分:0)
main
的唯一标准格式是
int main(void) { /* ... */ } int main(int argc, char *argv[]) { /* ... */ }
所有其他均为非标准。如果您从MS阅读文档,则会看到wmain
放在 Microsoft特定部分:
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()
来获得相同的东西而无需更改主签名
出于可移植性,您可以使用Boost.Nowide,以便所有内容都位于UTF-8中。较新的Windows 10和MSVC的标准库还支持将UTF-8设置为活动代码页,您可以使用GetCommandLineA
或有时使用普通main
获得Unicode args。参见What is the Windows equivalent for en_US.UTF-8 locale?
另请参见