/Zc:strictStrings (文字列リテラル型の変換の無効化)
指定された場合、コンパイラは、文字列リテラルを使用して初期化されたポインターに対して const 修飾による標準への厳密な準拠を要求します。
/Zc:strictStrings[-]
解説
/Zc:strictStrings が指定されると、コンパイラは、文字列リテラルに標準 C++ の const 修飾を (宣言によって、型 "const char の配列" または "const wchar_t の配列" として) 強制します。 文字列リテラルは変更不可であり、文字列リテラルの内容を変更しようとすると、実行時にアクセス違反エラーが発生します。 文字列ポインターは const として宣言して文字列リテラルで初期化するか、明示的な const_cast を使用して非 const ポインターを初期化する必要があります。 /Zc:strictStrings- が指定されている場合、または既定では、文字列リテラルで初期化された文字列ポインターに対して、コンパイラは標準 C++ の const 修飾を強制しません。
/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 ポインターの内容を変更しようとすると、コンパイラによってエラーとして報告されます。
注意
Visual Studio 2013 の Visual C++ の標準 C++ ライブラリでは、デバッグ ビルドでの /Zc:strictStrings コンパイラ オプションがサポートされていません。ビルド出力で複数の C2665 エラーが発生している場合は、このことが原因である可能性があります。
Visual C++ の準拠に関する問題の詳細については、「非標準動作」を参照してください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、「プロジェクトのプロパティの操作」を参照してください。
[C/C++] フォルダーを選択します。
[コマンド ライン] プロパティ ページを選択します。
/Zc:strictStrings が含まれるように "追加オプション" プロパティを変更し、[OK] をクリックします。