C6328
警告 C6328:大小不符:,當 <type> 為 <function>時,會呼叫需要 <type> 傳遞做為參數的 <number> 。
對於姓氏 is顯示()的 C 執行階段以字元為主的常式,透過型別 char 之 in 引數可能會產生無法預期的結果。 例如, SBCS 或 MBCS 型別 char 的單一位元組字元與值大於 0x7F 的是負值。 如果傳遞的是 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 範圍的字元轉換不需要,不過,字元範圍會造成無法預期的結果,一直到程式錯誤和終止。