0

最近、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 はこのコードに対して警告を表示せず、すべてが魅力的に機能します。

4

1 に答える 1

1

プログラムの中心にあるのは、ソース ファイルの解釈です。UTF-8 でエンコードされていることがわかります。そのため、6 バイトL'﹤'は 4 つの Unicode 文字として解釈されます。しかし、clang はどのようにしてそれを知るのでしょうか? 6 バイトを認識し、8 ビットのエンコードを想定しています。したがって、L'xyz'(正確な文字は、想定される 8 ビット文字セットに依存します)。clang は、y と z を無視して と解釈L'xyz'していることを示します。L'x'意図したとおりに動作する可能性はほとんどありません。

于 2010-07-27T14:00:29.213 に答える