错误C2196:大小写值'?已经使用

Error C2196: case value '?' already used

本文关键字:C2196 大小写 错误      更新时间:2023-10-16

Ok,在代码中使用Visual Studio Ultimate 2012(可能是ANSI, unicode等问题)构建时出现奇怪的错误…

switch (input[index])
{
    case 'א': // Alef Hebrew character
        if (/*conditional*/) 
        {
            // Do stuff.
        }
    break;
    case 'ב': // Beth Hebrew character
        if (/*conditional*/)
        {
            //Do stuff
        }
    break;
    default:
    {
            //Do some other stuff.
    }
    break;
}

第二个case参数生成…

Error C2196: case value '?' already used

假设inputwchar_t s的数组,您的问题是您正在比较宽字符和窄字符字面量。

正如peter在评论中所说:

如果您将文件保存为utf-8编码,则א0xD790, ב0xD791,因此,如果input[index]是char类型,则两者都将尝试匹配0xD7

这就是为什么你会得到你提到的错误。(char有足够的空间存储ASCII值,其余部分省略)


您可以通过在字面量前加上大写的L(将它们变成宽字符)来解决这个问题。

case L'א': // Alef Hebrew character
    if (/*conditional*/) 
    {
        // Do stuff.
    }
break;
case L'ב': // Beth Hebrew character
    if (/*conditional*/)
    {
        //Do stuff
    }
break;

另外,你需要确保你的源文件是用unicode编码&你的编译器知道如何处理它。

或者,您可以像这样简单地转义unicode值:

case L'u05D0': // Aleph Hebrew character
// ...
case L'u05D1': // Beth Hebrew character

C(和c++)在unicode处理方面是出了名的糟糕。问题是,你试图适应一些希伯来字符到char。但是一个char(单个字节)的宽度只够ASCII。

如果您使用的是现代(至少是c++ 11)版本的c++,请遵循此答案。

如果您使用的是C语言,您可能希望使用IBM的ICU库。

'א'字符不能放入字符中。通常需要几个字节,所以'א'构成了一个"多字符字面量",就像'ab'一样(注意:使用单引号)。

"多字符文字"的类型为int,值由实现定义。而且,不同的多字符字面值可能具有相同的值,因为有无限多个多字符字面值。

在您的情况下,显然您的编译器将'א''ב'视为'?',因此它会发出错误,因为相同的值('?')在同一个switch中出现在case标签之后两次。

假设您使用的是wchar_t,那么Ivan已经给出了修复。

如果您正在使用char,那么א是一个多字符串而不是字符。您可以使用比较字符串的函数来检查א是否出现在input的某个index:

const int ONE = 1;
if (strncmp(input+index, "א", sizeof("א") - ONE) == 0) {
      // Alef Hebrew character
    if (/*conditional*/) 
    {
       // Do stuff.
    }
} else if (strncmp(input+index, "ב", sizeof("ב") - ONE) == 0) {
     // Beth Hebrew character
    if (/*conditional*/)
    {
        //Do stuff
    }
} else {
    // default:
    // Do 
}