2010-07-27 103 views
0

我最近决定改用从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; 
    } 

在此,在的情况下的条件的所有字符都高Unicode字符,并因此被视为由铛解析器多字节字符,显然(源代码是UTF-8编码)。

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

GCC没有给出此代码的任何警告,一切工作就像一个魅力。

回答

1

在程序的心脏是源文件的解释。你知道它是UTF-8编码的。这就是为什么6字节L'﹤'被解释为4个Unicode字符。但是,铿锵会怎么知道?它看到6个字节,并假定8位编码。因此,它看到L'xyz'(精确字符取决于假定的8位字符集)。铛告诉你,它将L'xyz'解释为L'x',忽略y和z。这是非常不可能按预期工作的。

+1

嗯gcc从来没有任何问题在这里。有没有办法告诉clang正确处理UTF-8源文件,或者输入宽字符,以便铿锵理解它们? – 2010-07-27 14:07:01

+1

http://github.com/bratsche/clang建议不要:IV。缺少功能/改进 Lexer: *源字符映射。 GCC支持ASCII和UTF-8。 – MSalters 2010-07-27 14:30:50