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 告诉你它解释L'xyz'L'x',忽略 y 和 z。极不可能按预期工作。

于 2010-07-27T14:00:29.213 回答