C6328

的警告 C6328:范围不匹配:,在需要 <type> 调用 <function>时,<type> 通过为参数 <number>

对于 C 运行时基于字符在姓 isxxx()实例,将类型 char 的参数可能会具有不可预知的结果。例如,SBCS 或 MBCS 类型 char 单字节字符的值大于 0x7F 是负值。如果传递了一个 char,则编译器可能将该值转换为一个有符号的 int 或一个有符号的 long。编译器可能对该值进行符号扩展,从而产生意外的结果。例如,isspace 接受一个类型为 int 的参数;然而,其输入参数的值的有效范围是:

0 <= c <= 255,加上特殊值 EOF。

示例

默认情况下,char 是签名的输入 Visual C++,因此,类型字符的变量的值范围是 -128 <= c <= 127。因此,如果执行了以下操作:

#include <iostream>

void f( )
{
    char c = -37;
    int retVal = isspace( c );
    // code ...
}

可能对 c 进行符号扩展,使其成为值为 -37 的有符号 int,该值不在 isspace 的有效范围内。

如下面的代码所示,若要更正此问题,可以使用 static_cast,例如:

#include <iostream>

void f( )
{
    char c = -37;
    int retVal = isspace( static_cast<unsigned char> (c) );
    // code ...
}

警告 C6328 专门用来捕获此 bug。对于 7 位 ASCII 范围的字符该转换是不必要,但是,字符外部范围可能会具有不可预知的结果,并包括到程序错误和停止。