clang++ and u16string

clang++ and u16string

本文关键字:u16string and clang++      更新时间:2023-10-16

我用这行简单的代码和最新的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或苹果的clang 3.0,不支持Unicode字符串字面值。最新的可用版本,从主干源代码的顶部构建,支持Unicode字符串字面值。

clang的下一个llvm.org版本(即3.0)将支持Unicode字符串文本语法,但不支持ASCII以外的任何源文件编码。因此,即使使用llvm.org版本,您也不能在源代码中直接键入这些字符并将它们转换为UTF-16编码的字符串值。相反,您必须使用u转义。同样,top of trunk也支持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++ 11特性测试clang,例如:

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

这里是状态页:

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