C6401
Предупреждение C6401: использование <имя функции> на языке по умолчанию для сравнения без учета регистра со строкой константы <имя строки>. При применении для языков, отличных от английского, могут возникнуть непредвиденные результаты.
Данное предупреждение означает, что при сравнении строковой константы без учета регистра указан языковой стандарт по умолчанию; обычно в такой ситуации выполняется сравнение, независимое от языкового стандарта.
Как правило, в результате этой ошибки могут возникнуть неверные результаты для языков, отличных от английского. Например, в турецком языке ".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);
}