2010-07-27 27 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