C6328

更新:2007 年 11 月

警告 C6328:已将 <type> 作为参数 <number> 传递,而需要使用 <type> 调用 <function>

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

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

示例

默认情况下,char 在 Visual C++ 中为有符号类型,所以 char 类型的变量的值范围是 -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 范围中的字符,没有必要进行强制转换,但是该范围以外的字符将在运行时导致断言和/或崩溃。