【问题标题】:Can we use wmain() with Unix compilers or it'll work only on Windows?我们可以将 wmain() 与 Unix 编译器一起使用,还是只能在 Windows 上工作?
【发布时间】:2011-01-27 03:42:03
【问题描述】:

我们能否在 Unix 编译器中使用 wmain() 函数,或者它仅适用于 Windows?

【问题讨论】:

    标签: c++ c unix widestring wmain


    【解决方案1】:

    main 的唯一标准签名是:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        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++?

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

          微软特定

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

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

          您也可以使用在 tchar.h 中定义的_tmain_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?

          另见

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-11-09
            • 1970-01-01
            • 2014-08-02
            • 1970-01-01
            • 2018-06-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多