我们能否在Unix编译器中使用wmain(),或者它只能在Windows上工作?

15

我们能否在Unix编译器中使用wmain()函数,还是它只能在Windows上工作?

5个回答

14

main 函数的唯一标准签名为:

int main(void);
int main(int argc, char *argv[]);

然而,独立实现可以提供扩展/允许其他签名。但这些不能保证可移植性。wmain看起来像是Windows/VS的东西。在*nix/GNU GCC上运行的机会很少。


14

wmain函数签名在Windows中存在,用于处理宽字符命令行参数。通常,在Windows应用程序中偏好使用UTF16编码,而Unix应用程序偏好使用UTF8编码来表示Unicode字符串。UTF8使用普通的char字符串,因此标准的main函数签名适用于支持Unicode的Unix应用程序。

如果您想创建一个便携式控制台应用程序,不需要使用Unicode命令行参数,请使用main函数。如果您确实需要Unicode命令行参数,则需要使用预处理指令,在每个环境中启用适当的函数签名。

如果您正在制作跨平台GUI应用程序,请使用特殊框架,如Qt。


4

main的唯一标准形式有以下两种:

int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }

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

其它的都是非标准的。如果你阅读来自微软的文档,你会发现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 to main unless _UNICODE is defined. In that case, _tmain resolves to wmain.

main function and command-line arguments

它的主要目的是获取Unicode参数,如文件名。然而,它相当无用,大多数人实际上不使用它,因为您可以调用GetCommandLineW()CommandLineToArgvW()来获取相同的内容,而不需要更改主函数的签名。

为了可移植性,您可以使用Boost.Nowide使所有内容都变为UTF-8。新的Windows 10和MSVC标准库也支持将UTF-8设置为活动代码页,您可以使用GetCommandLineA或有时使用普通的main来获取Unicode参数。请参见什么是en_US.UTF-8区域设置的Windows等效项?

另请参阅:


3

wmain()是Windows特有的。就像_tmain一样,如果这很重要的话...


0
是的,如果你说的“Unix编译器”是指在Unix中使用编译器,但不一定是为Unix目标进行编译。当交叉编译到Windows目标时,你可以在GCC中传递-municode参数,使得wmainwWinMain函数能够正常工作。但是对于*nix目标,这些主函数仍然无法正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接