/Zc:strictStrings
(文字列リテラル型の変換の無効化)
指定された場合、コンパイラは、文字列リテラルを使用して初期化されたポインターに対して const
修飾による標準への厳密な準拠を要求します。
構文
$
解説
/Zc:strictStrings
が指定されると、コンパイラは、文字列リテラルに標準 C++ の const
修飾を (宣言によって、"const char
の配列" または "const wchar_t
の配列" 型として) 強制します。 文字列リテラルは変更不可であり、文字列リテラルの内容を変更しようとすると、実行時にアクセス違反エラーが発生します。 文字列ポインターは const
として宣言して文字列リテラルで初期化するか、明示的な const_cast
を使用して非 const
ポインターを初期化する必要があります。 /Zc:strictStrings-
が指定されている場合、または既定では、文字列リテラルで初期化された文字列ポインターに対して、コンパイラは標準 C++ の const
修飾を強制しません。
既定では、/Zc:strictStrings
オプションはオフになっています。 /permissive-
コンパイラ オプションでは、このオプションを暗黙的に設定しますが、/Zc:strictStrings-
を使用してオーバーライドできます。
/Zc:strictStrings
オプションは、不適切なコードのコンパイルを防ぐために使用します。 この例では、単純な宣言エラーが実行時のクラッシュを招くことを示しています。
// strictStrings_off.cpp
// compile by using: cl /W4 strictStrings_off.cpp
int main() {
wchar_t* str = L"hello";
str[2] = L'a'; // run-time error: access violation
}
/Zc:strictStrings
を有効にした場合は、同じコードで str
宣言エラーが報告されます。
// strictStrings_on.cpp
// compile by using: cl /Zc:strictStrings /W4 strictStrings_on.cpp
int main() {
wchar_t* str = L"hello"; // error: Conversion from string literal
// loses const qualifier
str[2] = L'a';
}
auto
を使用して文字列ポインターを宣言すると、正しい const
ポインター型宣言がコンパイラによって作成されます。 const
ポインターの内容を変更しようとすると、コンパイラによってエラーとして報告されます。
Note
Visual Studio 2013 の C++ 標準ライブラリでは、デバッグ ビルドでの /Zc:strictStrings
コンパイラ オプションがサポートされていません。 ビルド出力で複数の C2665 エラーが発生している場合は、このことが原因である可能性があります。
Visual C++ の準拠に関する問題について詳しくは、「 Nonstandard Behavior」をご覧ください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。
/Zc:strictStrings
が含まれるように [追加のオプション] プロパティを変更し、[OK] を選択します。