编译器警告(等级 4)C4770

用作索引的部分验证的枚举 'symbol'

如果枚举值被强制转换为整数类型,但对于非负值或过度值,则编译器将发出警告,但结果不会检查。

备注

此警告是 Visual Studio 2013 的新增功能。 默认情况下不启用此功能。 若要将其作为级别 1 警告启用,请使用 /w14770。 有关如何按编译器版本禁用警告的信息,请参阅由编译器版本引发的编译器警告

示例

以下代码生成警告 C4770:

// c4770.cpp
// compile by using: cl /GL /w14770 c4770.cpp

enum E { a  0, b, c, E_MAX };

int main(int argc, char *argv[])
{
    const E e1 = E(argc); // value unknown at compile time

    if ((int)(e1) >= E_MAX)
        return 0;

    const int n = e1 + e1;  // C4770 partially validated enum used as index

    return argv[n][n];
}

若要修复警告,可以将 unsigned int 检查中的值强制转换为非负值:

    if ((unsigned int)(e1) >= E_MAX) 
        return 0;

或者,显式检查非负值:

    if ((int)(e1) >= E_MAX || (int)(e1) < 0)
        return 0;