/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 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

  3. /Zc:strictStrings が含まれるように [追加のオプション] プロパティを変更し、[OK] を選択します。

関連項目

/Zc (準拠)