clang ++ и u16string - PullRequest
       13

clang ++ и u16string

5 голосов
/ 24 ноября 2011

У меня чертовски много времени с этой простой строкой кода и новейшим 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"鵝滿是快烙滴好耳痛"

Ответы [ 2 ]

5 голосов
/ 24 ноября 2011

Последние выпущенные версии clang, v2.9 с llvm.org или Apple clang 3.0, не поддерживают строковые литералы Unicode.Последняя доступная версия, построенная из верхней части магистрального источника, поддерживает строковые литералы Юникода.

В следующем выпуске clang (то есть 3.0) llvm.org будет поддерживать строковый литерал Юникода,но не поддерживает никакой кодировки исходного файла, кроме ASCII.Поэтому даже с этим выпуском llvm.org вы не сможете вводить эти символы буквально в исходном коде и конвертировать их в строковое значение в кодировке UTF-16.Вместо этого вам придется использовать \ u Escape.Опять же, top of trunk поддерживает исходный код UTF-8, но он не был вовремя введен в выпуск llvm.org 3.0, который в настоящее время тестируется.В следующем выпуске после этого (через 6 месяцев или около того) должна быть улучшена поддержка исходного кода UTF-8 (но не других исходных кодировок).

Редактировать: версия Clang для Xcode 4.3 действительно имеет этиFeatures.

Редактировать: И теперь выпуск 3.1 от LLVM.org содержит их

Так что 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
}

Оказывается, стандарт на самом деле не требует большой поддержки char16_t и char32_t в библиотеке iostreams, поэтому вам, вероятно, придется преобразовать его в другой тип строки, чтобы извлечь из этого много пользы.По крайней мере, требуется возможность преобразования между ними и более полезным std :: string (хотя это не совсем удобно для настройки ...).

2 голосов
/ 24 ноября 2011

Вы можете проверить Clang для отдельных функций C ++ 11, например:

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

и вот страница статуса:

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

...