我们能否在Unix编译器中使用wmain()
函数,还是它只能在Windows上工作?
我们能否在Unix编译器中使用wmain()
函数,还是它只能在Windows上工作?
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。
main
的唯一标准形式有以下两种:
int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }
其它的都是非标准的。如果你阅读来自微软的文档,你会发现wmain
被放置在Microsoft Specific部分:
Microsoft Specific
If your source files use Unicode wide characters, you can use
wmain
, which is the wide-character version of main. The declaration syntax for wmain is as follows:
int wmain( ); int wmain(int argc, wchar_t *argv[], wchar_t *envp[]);
You can also use
_tmain
, which is defined in tchar.h._tmain
resolves tomain
unless_UNICODE
is defined. In that case,_tmain
resolves towmain
.
它的主要目的是获取Unicode参数,如文件名。然而,它相当无用,大多数人实际上不使用它,因为您可以调用GetCommandLineW()
和CommandLineToArgvW()
来获取相同的内容,而不需要更改主函数的签名。
为了可移植性,您可以使用Boost.Nowide使所有内容都变为UTF-8。新的Windows 10和MSVC标准库也支持将UTF-8设置为活动代码页,您可以使用GetCommandLineA
或有时使用普通的main
来获取Unicode参数。请参见什么是en_US.UTF-8区域设置的Windows等效项?
另请参阅:
wmain()
是Windows特有的。就像_tmain
一样,如果这很重要的话...
-municode
参数,使得wmain
和wWinMain
函数能够正常工作。但是对于*nix目标,这些主函数仍然无法正常工作。