共用方式為


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 範圍的字元轉換不需要,不過,字元範圍會造成無法預期的結果,一直到程式錯誤和終止。