13

我们可以将该wmain()函数与 Unix 编译器一起使用,还是仅适用于 Windows?

4

4 回答 4

14

唯一的标准签名main是:

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

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

于 2010-03-13T12:29:20.637 回答
14

wmainWindows 中存在用于处理宽字符命令行参数的签名。通常,虽然 Windows 应用程序更喜欢 UTF16,但 Unix 应用程序更喜欢 UTF8 进行 Unicode 字符串编码。UTF8 使用常规char字符串,因此标准main签名对于支持 Unicode 的 Unix 应用程序来说已经足够了。

如果要制作不需要 Unicode 命令行参数的便携式控制台应用程序,请使用main. 如果您确实需要 Unicode 命令行参数,那么您需要预处理器指令来启用适合每个环境的签名。

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

于 2010-03-13T15:46:05.087 回答
3

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

于 2010-03-13T13:25:26.907 回答
1

唯一的标准形式main

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

main() 在 C 和 C++ 中应该返回什么?

其他都是非标准的。如果您阅读 MS 的文档,您会看到该文档wmain位于Microsoft 特定部分:

微软特定

如果您的源文件使用 Unicode 宽字符,您可以使用wmain,这是 main 的宽字符版本。wmain 的声明语法如下:

int wmain( );
int wmain(int argc, wchar_t *argv[], wchar_t *envp[]);

您也可以使用_tmaintchar.h 中定义的 。_tmain解析为main除非_UNICODE已定义。在这种情况下,_tmain解析为wmain

主函数和命令行参数

它的主要目的是获取文件名等Unicode参数。然而它非常没用,大多数人实际上并没有使用它,因为你可以调用GetCommandLineW()CommandLineToArgvW()获得相同的东西,而不需要对 main 的签名进行任何更改

为了可移植性,您可以使用Boost.Nowide,以便所有内容都使用 UTF-8。较新的 Windows 10 和 MSVC 的标准库还支持将 UTF-8 设置为活动代码页,您可以使用GetCommandLineA或有时使用普通的main. 请参阅en_US.UTF-8 语言环境的 Windows 等效项是什么?

也可以看看

于 2020-09-22T02:44:40.113 回答