Использование широких символьных констант с clang Возвращает «посторонние символы в широкой символьной константе игнорируются» Ошибка - PullRequest
0 голосов
/ 27 июля 2010

Я недавно решил переключиться на clang с gcc, и я получаю следующее предупреждение за использование констант широких символов: "посторонние символы в константе широких символов игнорируются" .Вот код, который получает предупреждение:

wstring& line;
…
for (wstring::iterator ch = line.begin(); ch != line.end(); ++ch)
    switch (*ch) {
        case L'│': *ch = L'|'; break;
        case L'﹤': *ch = L'<'; break;
        case L'﹥': *ch = L'>'; break;
        case L'﹙': *ch = L'('; break;
        case L'﹚': *ch = L')'; break;
        default: break;
    }

Здесь все символы в условиях case являются символами с высоким юникодом и, следовательно, воспринимаются синтаксическим анализатором clang как многобайтовые символы (очевидно, исходный код UTF)-8 закодировано).

Мой вопрос заключается в том, что означает предупреждение.То есть то, что именно игнорируется.Кроме того, с учетом этого предупреждения будет ли моя программа работать так, как задумано?

gcc не выдает никаких предупреждений для этого кода, и все работает как чудо.

1 Ответ

1 голос
/ 27 июля 2010

В основе программы лежит интерпретация исходного файла.Вы знаете, что это кодировка UTF-8.Вот почему 6 байтов L'﹤' следует интерпретировать как 4 символа Юникода.Но как лязг бы знать?Он видит 6 байтов и предполагает 8-битное кодирование.Таким образом, он видит L'xyz' (точные символы зависят от предполагаемого 8-битного набора символов).clang сообщает, что интерпретирует L'xyz' как L'x', игнорируя y и z.Крайне маловероятно, что это работает как задумано.

...