C6401
警告 C6401: 既定ロケールで <関数名> が、定数文字列 <文字列名> と大文字と小文字を区別しないで比較するために使用されています。英語でないロケールで予期しない結果が生成されます
この警告は、既定のロケールを指定する際に、定数文字列に対して大文字小文字を区別しない比較が行われることを示します。この場合、通常はロケールに依存しない比較が意図されています。
この問題は、通常、英語以外の言語が使われるロケールで不適切な動作を引き起こします。たとえば、トルコ語では ".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);
}