我们可以在Unix编译器中使用wmain()函数,还是仅在windows上使用?

时间:2010-03-13 12:25:27

标签: c++ c unix widestring wmain

我们可以在Unix编译器中使用wmain()函数,还是只能在\ for Windows上使用?

4 个答案:

答案 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[]) { /* ... */ }

What should main() return in C and C++?

所有其他均为非标准。如果您从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

main function and command-line arguments

其主要目的是获取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?

另请参见