C6401
警告 C6401:在默认区域设置中使用 <function name> 执行与常数字符串 <string name> 的不区分大小写的比较。 这样会在非英语区域设置中产生意外结果
此警告意味着,当指定默认区域设置时执行与常数字符串的不区分大小写的比较;通常,需要执行与区域设置无关的比较。
此缺陷通常会导致非英语区域设置中出现错误行为。 例如,在土耳其语中,“.gif”与“.GIF”不匹配;而在越南语中,“LogIn”与“LOGIN”不匹配。
CompareString 函数将区域设置作为一个参数,但是,如果传递一个默认区域设置,例如,常数 LOCALE_USER_DEFAULT,则将导致在不同区域设置中产生不同的行为,具体取决于用户的默认值。 通常,与常数字符串的不区分大小写的比较应在与区域设置无关的比较中执行。
若要在 Windows XP 上使用 CompareString 执行与区域设置无关的比较,第一个参数应为常数 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);
}