的警告 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 范围的字符该转换是不必要,但是,字符外部范围可能会具有不可预知的结果,并包括到程序错误和停止。