在clang中使用宽字符常量获取“宽字符常量中忽略的无关字符”错误

时间:2010-07-27 12:24:26

标签: c++ unicode clang widechar

我最近决定从gcc切换到clang并且因为我使用宽字符常量而得到以下警告:“宽字符常量字符常量忽略”。以下是获取警告的代码:

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条件中的字符都是高unicode字符,因此被clang解析器看作多字节字符,显然(源代码是UTF-8编码的)。

我的问题是警告信息背后的含义是什么。也就是说,究竟被忽略了什么。另外,鉴于此警告,我的程序是否会按设计工作?

gcc没有对此代码发出任何警告,一切都像魅力一样。

1 个答案:

答案 0 :(得分:1)

该计划的核心是对源文件的解释。你知道它是UTF-8编码的。这就是6​​字节L'﹤'被解释为4个Unicode字符的原因。但铿锵怎么会知道的?它看到6个字节,并假设8位编码。因此,它看到L'xyz'(精确的字符取决于假定的8位字符集)。 clang告诉你,它将L'xyz'解释为L'x',忽略了y和z。按预期工作的可能性极小。