Apple C++ LLVM 编译器 4.x 和 UNICODE:何时需要? UNICODE 是默认编译器字符集吗?使您的代码同时编译 ANSI 和 UNICODE 版本

Posted

技术标签:

【中文标题】Apple C++ LLVM 编译器 4.x 和 UNICODE:何时需要? UNICODE 是默认编译器字符集吗?使您的代码同时编译 ANSI 和 UNICODE 版本【英文标题】:Apple C++ LLVM Compiler 4.x & UNICODE: when needed? Is UNICODE default compiler charset? Making your code compiling both ANSI and UNICODE versions 【发布时间】:2013-05-17 11:48:00 【问题描述】:

我有 Microsoft C++ 编译器经验。 在那里,您可以非常简单地调整使用/不使用 UNICODE 编译路径。 以下构造是合法且完全可能的:

#ifdef UNICODE
typedef std::wstring string;
#else
typedef std::string string;
#endif

但是如何使用 Apple LLVM 编译器处理相同的情况?

附: GCC 提示也将不胜感激。

更新: 在 Windows 编程中,最好使用 UNICODE 字符串(特别是,如果您大量使用基于 UNICODE 的 WinAPI)。是否有任何理由在 LLVM 或 GCC for OSX 和 ios 上使用 wstring 而不是 string(字符集差异除外)?

【问题讨论】:

什么情况?是什么让您认为这种情况在其他编译器中甚至存在? @R.MartinhoFernandes 嗯..)我理解你。这是一种习惯。我对此有点困惑。所以我问你。 【参考方案1】:

有争议的是,您甚至应该关心支持多种类型的字符串(这取决于应用程序),但也许以下方法应该可行:

#if defined(_WIN32) && defined(UNICODE)
    typedef std::wstring string;
#else
    typedef std::string string;
#endif

此外,请阅读以下帖子以了解有关不同类型字符串及其用例的所有信息:std::wstring VS std::string

【讨论】:

非常好的答案。谢谢你。你能不能稍微扩展你的答案,并以简洁的方式告诉我我是否应该担心在 OS X(和 iOS)上使用宽字符串?还是 std::string 足以使用任何 OS X Core Foundations API?谢谢! 我不是 OS X 专家,所以我可能完全不在此列,但我会拒绝。使用 wstring 的理由很少。事实上,你最好只使用 std::string 并在必要时转换为 unicode。 关于基于 WinAPI 的应用程序,使用 std::string 非常不方便,因为您会丢失经常发生的转换(UNICODE ANSI)。当然,您可以使用 WinAPI 函数的 ANSI 别名,但它们只是将您的 ANSI 编码参数隐式转换为 UNICODE 参数并调用基于 ALL UNICODE 的“真实”API 代码的宏(请参阅 J.Richter “Programming Windows”第 5 版) .). 我的意思是在 OSX 上需要 Unicode 字符串的情况。我所说的关于 Win32 的内容仍然有效(我前面提到的链接也证实了这一点)。 好的。我刚刚添加了我的经验,养成了思考 UNICODE/非 UNICODE 的习惯。再次感谢!

以上是关于Apple C++ LLVM 编译器 4.x 和 UNICODE:何时需要? UNICODE 是默认编译器字符集吗?使您的代码同时编译 ANSI 和 UNICODE 版本的主要内容,如果未能解决你的问题,请参考以下文章

使用 arm-apple-darwin10-llvm-gcc-4.2 在 MacOS 上交叉编译问题

Apple LLVM 编译器 4.2 错误:没有这样的文件或目录

在 Xcode 5 上使用 Boost - Apple LLVM 5.0

xcode 4.6 目标构建设置缺少“Apple LLVM 编译器 4.2 - ...”部分

如何使用 LLVM 在 Windows 上为 ARM 编译 C++ 程序?

构建时出现 Apple LLVM 5.0 错误