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のclang3.0からリリースされた最新バージョンのclangv2.9は、Unicode文字列リテラルをサポートしていません。トランクソースの上から構築された最新の利用可能なバージョンは、Unicode文字列リテラルをサポートします。

clangの次のllvm.orgリリース(つまり、3.0)は、Unicode文字列リテラル構文をサポートしますが、ASCII以外のソースファイルエンコーディングはサポートしません。そのため、そのllvm.orgリリースを使用しても、これらの文字を文字通りソースに入力して、UTF-16でエンコードされた文字列値に変換することはできません。代わりに、\uエスケープを使用する必要があります。繰り返しになりますが、top of trunkはUTF-8ソースコードをサポートしていますが、現在テスト中のllvm.org3.0リリースに間に合いませんでした。その後の次のリリース(6か月程度)では、UTF-8ソースコードのサポートが向上するはずです(他のソースエンコーディングはサポートされません)。

編集:Xcode4.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の間で変換する機能が必要です(ただし、セットアップには必ずしも便利ではありません...)。

于 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 に答える