C6401
警告 C6401: 在預設地區設定中使用 <function name> 執行與常數字串 < string name> 的不區分大小寫的比較。 在非英文地區設定中產生未預期的結果
這則警告表示指定預設地區設定時,正在執行與常數字串之不區分大小寫的比較。通常要進行的會是與地區設定無關的比較。
這項缺失的常見後果是在非英文之地區設定中產生不正確的行為。 例如,在土耳其文地區設定中,".gif" 會與 ".GIF" 不相符,而在越南文地區設定中,"LogIn" 則與 "LOGIN" 不相符。
CompareString 函式會將地區設定當成引數。然而,在預設地區設定 (例如,常數 LOCALE_USER_DEFAULT) 中傳遞時,則會在不同地區設定中造成不同行為 (視使用者的預設值而定)。 通常,應在與地區設定無關的比較中執行與常數字串的不區分大小寫比較。
若要使用 CompareString 在 Windows XP 上執行與地區設定無關的比較,則第一個參數應該是常數 LOCALE_INVARIANT。例如,若要執行與地區設定無關的測試,在不區分大小寫差異的情況下檢查 pString 是否符合 file1.gif,請使用下列呼叫:
CompareString(LOCALE_INVARIANT,
NORM_IGNORECASE,
pString,
-1,
TEXT("file1.gif"),
-1) == CSTR_EQUAL
範例
下列程式碼將產生出這個警告:
include <windows.h>
int fd(char *ext)
{
return (CompareString(LOCALE_USER_DEFAULT,
NORM_IGNORECASE,
ext,
-1,
TEXT("gif"),
-1) == 2);
}
若要更正這則警告,請使用下列程式碼:
include <windows.h>
int f(char *ext)
{
return (CompareString(LOCALE_INVARIANT,
NORM_IGNORECASE,
ext,
-1,
TEXT("gif"),
-1) == 2);
}