c++ - clang++ 和 u16string

标签 c++ c++11 clang++

这行简单的代码和最新的 clang++ 让我玩得很开心

#include <stdio.h>
#include <string>

using std::u16string;


int main ( int argc, char** argv )
{
    u16string s16 = u"鵝滿是快烙滴好耳痛";

    return EXIT_SUCCESS;
}


Ben-iMac:Desktop Ben$ clang++ -std=c++0x -stdlib=libc++ main.cpp -o main
main.cpp:15:21: error: use of undeclared identifier 'u'
    u16string s16 = u"鵝滿是快烙滴好耳痛"

最佳答案

clang 的最新发布 版本,来自 llvm.org 的 v2.9 或 Apple 的 clang 3.0,不支持 Unicode 字符串文字。最新的可用版本,基于主干源构建,支持 Unicode 字符串文字。

clang 的下一个 llvm.org 版本(即 3.0)将支持 Unicode 字符串文字语法,但不支持 ASCII 以外的任何源文件编码。因此,即使使用 llvm.org 版本,您也无法在源代码中逐字输入这些字符并将它们转换为 UTF-16 编码的字符串值。相反,您必须使用\u 转义符。同样,主干顶部确实支持 UTF-8 源代码,但它没有及时放入当前正在测试的 llvm.org 3.0 版本。之后的下一个版本(6 个月左右)应该对 UTF-8 源代码(但不是其他源编码)有更好的支持。

编辑:Xcode 4.3 版的 clang 确实具有这些功能。

编辑:现在 LLVM.org 的 3.1 版本有它们

因此 clang 现在完全支持以下内容:

#include <string>

int main() {
    std::u16string a = u"鵝"; // UTF-8 source is transformed into UTF-16 literal
    std::u32string b = U"滿"; // UTF-8 source is transformed into UTF-32 literal
}

事实证明,该标准实际上并不需要 iostreams 库中对 char16_t 和 char32_t 的太多支持,因此您可能必须转换为另一种字符串类型才能充分利用它。至少需要在这些和更有用的 std::string 之间进行转换的能力(尽管设置起来并不十分方便...)。

关于c++ - clang++ 和 u16string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8256258/

相关文章:

c++ - 使用 C++/Obj-C 创建小部件?

c++ - 为什么在 lambda 中通过引用捕获的值被破坏了?

c++ - VS2012 中的 emplace_back 和 shared_ptr vector

c++ - 如果语句包含宏,则 clang 无法替换语句

c++ - 有什么区别?铿锵++ |铿锵 -std=c++11

c++ - C++ 赋值运算符可以是自由函数吗?

c++ - 在 C++ 中,我可以使用多线程工具将 UNIX 信号与我的主程序同步吗?

c++ - 使用 LDAP 和 Windows Active Directory 进行用户身份验证 (Windows Server 2016)

c++ - 更改模板返回类型似乎对重载决议有影响

c++ - 类(class)成员重新排序