다음을 통해 공유


/Zc:strictStrings (문자열 리터럴 형식 변환 사용 안 함)

지정한 경우 컴파일러에는 문자열 리터럴을 사용하여 초기화한 포인터에 대한 엄격한 const 한정 규칙이 필요합니다.

구문

/Zc:strictStrings[-]

설명

지정된 경우 /Zc:strictStrings 컴파일러는 선언에 따라 문자열 리터럴에 표준 C++ const 한정을 'array of' 또는 'array ofconst charconst 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 포인터의 내용을 수정하려는 시도는 컴파일러에서 오류로 보고합니다.

참고 항목

Visual Studio 2013의 C++ 표준 라이브러리는 디버그 빌드의 /Zc:strictStrings 컴파일러 옵션을 지원하지 않습니다. 빌드 출력에 몇 가지 C2665 오류가 표시되는 경우 이것이 원인일 수 있습니다.

Visual C++의 규칙과 관련된 문제에 대한 자세한 내용은 Nonstandard Behavior을 참조하세요.

Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.

  2. 구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.

  3. 포함 /Zc:strictStrings 하도록 추가 옵션 속성을 수정한 다음 확인을 선택합니다.

참고 항목

/Zc(규칙)