我最近决定从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没有对此代码发出任何警告,一切都像魅力一样。
答案 0 :(得分:1)
该计划的核心是对源文件的解释。你知道它是UTF-8编码的。这就是6字节L'﹤'
被解释为4个Unicode字符的原因。但铿锵怎么会知道的?它看到6个字节,并假设8位编码。因此,它看到L'xyz'
(精确的字符取决于假定的8位字符集)。 clang告诉你,它将L'xyz'
解释为L'x'
,忽略了y和z。按预期工作的可能性极小。