C语言 我们可以在Unix编译器中使用wmain(),或者它只能在Windows上工作吗?

tvz2xvvm  于 2023-06-21  发布在  Unix
关注(0)|答案(5)|浏览(150)

我们可以在Unix编译器中使用wmain()函数吗?或者它只能在Windows上工作?

gpfsuwkq

gpfsuwkq1#

main的唯一标准签名是:

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

然而,独立的实现可以提供扩展/允许其他签名。但这些并不保证是便携式的。wmain看起来像Windows/VS的东西。这在 *nix/GNU GCC上工作的可能性不大。

gudnpqoy

gudnpqoy2#

Windows中存在wmain签名,用于处理宽字符命令行参数。通常,Windows应用程序更喜欢UTF16,而Unix应用程序更喜欢UTF8作为Unicode字符串编码。UTF8使用常规的char字符串,因此标准的main签名足以支持Unicode的Unix应用程序。
如果您想创建一个不需要Unicode命令行参数的便携式控制台应用程序,请使用main。如果您确实需要Unicode命令行参数,那么您需要预处理器指令来启用适合于每个环境的签名。
如果你正在开发一个跨平台的GUI应用程序,请使用一个特殊的框架,比如Qt。

rqenqsqc

rqenqsqc3#

main的唯一标准形式是

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

What should main() return in C and C++?
其他都是非标准的。如果你从MS阅读文档,你会看到wmain被放在 Microsoft Specific 部分:

微软专用

如果源文件使用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()来获得相同的东西,而不需要对main的签名进行任何更改
对于可移植性,您可以使用Boost.Nowide,以便所有内容都是UTF-8。较新的Windows 10和MSVC的标准库还支持将UTF-8设置为活动代码页,您可以使用GetCommandLineA或有时使用普通的main获取Unicode参数。参见What is the Windows equivalent for en_US.UTF-8 locale?
另见

uurv41yg

uurv41yg4#

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

szqfcxe2

szqfcxe25#

是的,如果“Unix编译器”是指在Unix中使用编译器,但不一定编译Unix目标。在交叉编译Windows目标时,可以将-municode传递给GCC,以使wmainwWinMain工作。但它仍然不能使这些主要功能为 *nix目标工作。

相关问题