5

这行简单的代码和最新的 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"鵝滿是快烙滴好耳痛"
4

2 回答 2

5

来自 llvm.org 或 Apple 的 clang 3.0的最新版本clang,v2.9 不支持 Unicode 字符串文字。从主干源代码构建的最新可用版本确实支持 Unicode 字符串文字。

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

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

编辑:现在 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 之间进行转换的能力(尽管设置起来不太方便......)。

于 2011-11-24T15:51:04.483 回答
2

您可以针对单个 C++11 功能测试 clang,例如:

http://clang.llvm.org/docs/LanguageExtensions.html#cxx_unicode_literals

这是一个状态页面:

http://clang.llvm.org/cxx_status.html

于 2011-11-24T15:45:34.257 回答