共用方式為


C6328

警告 C6328: 傳遞 <type> 做為參數 <number>,但 <function> 呼叫中需要 <type>

若為開頭為 is* 的常式,傳遞型別為 char 的引數可能會產生無法預期的結果。 例如,值大於 0x7F 且型別為 char 的 SBCS 或 MBCS 單一位元組字元為負值。 如果傳遞的是 char,則編譯器 (Compiler) 可能會將該值轉換成帶正負號 (Signed) 的 int 或帶正負號的 long。 這個值是由編譯器進行 sign-extended,會有未預期的結果。 例如,isspace 會接受 (Accept) 型別為 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 sign-extended 成帶正負號的 int (值為 -37),這是位在 isspace 的有效範圍外部。

若要更正這個問題,請使用 static_cast,如下列程式碼所示:

#include <iostream>

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

警告 C6328 的存在特別是用於攔截這個 Bug。 若為位於 7 位元 ASCII 範圍內的字元,則不需要進行轉型 (Cast),但在該範圍外的字元會在執行階段造成判斷提示 (Assert) 和 (或) 損毀。