我们可以在Unix编译器中使用wmain()函数吗?或者它只能在Windows上工作?
wmain()
gpfsuwkq1#
main的唯一标准签名是:
main
int main(void); int main(int argc, char *argv[]);
然而,独立的实现可以提供扩展/允许其他签名。但这些并不保证是便携式的。wmain看起来像Windows/VS的东西。这在 *nix/GNU GCC上工作的可能性不大。
wmain
gudnpqoy2#
Windows中存在wmain签名,用于处理宽字符命令行参数。通常,Windows应用程序更喜欢UTF16,而Unix应用程序更喜欢UTF8作为Unicode字符串编码。UTF8使用常规的char字符串,因此标准的main签名足以支持Unicode的Unix应用程序。如果您想创建一个不需要Unicode命令行参数的便携式控制台应用程序,请使用main。如果您确实需要Unicode命令行参数,那么您需要预处理器指令来启用适合于每个环境的签名。如果你正在开发一个跨平台的GUI应用程序,请使用一个特殊的框架,比如Qt。
char
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?另见
_tmain
_UNICODE
GetCommandLineW()
CommandLineToArgvW()
GetCommandLineA
uurv41yg4#
wmain()是Windows特定的。就像_tmain一样,如果这很重要的话...
szqfcxe25#
是的,如果“Unix编译器”是指在Unix中使用编译器,但不一定编译Unix目标。在交叉编译Windows目标时,可以将-municode传递给GCC,以使wmain和wWinMain工作。但它仍然不能使这些主要功能为 *nix目标工作。
-municode
wWinMain
5条答案
按热度按时间gpfsuwkq1#
main
的唯一标准签名是:然而,独立的实现可以提供扩展/允许其他签名。但这些并不保证是便携式的。
wmain
看起来像Windows/VS的东西。这在 *nix/GNU GCC上工作的可能性不大。gudnpqoy2#
Windows中存在
wmain
签名,用于处理宽字符命令行参数。通常,Windows应用程序更喜欢UTF16,而Unix应用程序更喜欢UTF8作为Unicode字符串编码。UTF8使用常规的char
字符串,因此标准的main
签名足以支持Unicode的Unix应用程序。如果您想创建一个不需要Unicode命令行参数的便携式控制台应用程序,请使用
main
。如果您确实需要Unicode命令行参数,那么您需要预处理器指令来启用适合于每个环境的签名。如果你正在开发一个跨平台的GUI应用程序,请使用一个特殊的框架,比如Qt。
rqenqsqc3#
main
的唯一标准形式是What should main() return in C and C++?
其他都是非标准的。如果你从MS阅读文档,你会看到
wmain
被放在 Microsoft Specific 部分:微软专用
如果源文件使用Unicode宽字符,则可以使用
wmain
,这是main的宽字符版本。wmain的声明语法如下:您还可以使用
_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?另见
uurv41yg4#
wmain()
是Windows特定的。就像_tmain
一样,如果这很重要的话...szqfcxe25#
是的,如果“Unix编译器”是指在Unix中使用编译器,但不一定编译Unix目标。在交叉编译Windows目标时,可以将
-municode
传递给GCC,以使wmain
和wWinMain
工作。但它仍然不能使这些主要功能为 *nix目标工作。