/Zc:strictStrings
(문자열 리터럴 형식 변환 사용 안 함)
지정한 경우 컴파일러에는 문자열 리터럴을 사용하여 초기화한 포인터에 대한 엄격한 const
한정 규칙이 필요합니다.
구문
/Zc:strictStrings
[-
]
설명
지정된 경우 /Zc:strictStrings
컴파일러는 선언에 따라 문자열 리터럴에 표준 C++ const
한정을 'array of' 또는 'array ofconst 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
포인터의 내용을 수정하려는 시도는 컴파일러에서 오류로 보고합니다.
참고 항목
Visual Studio 2013의 C++ 표준 라이브러리는 디버그 빌드의 /Zc:strictStrings
컴파일러 옵션을 지원하지 않습니다. 빌드 출력에 몇 가지 C2665 오류가 표시되는 경우 이것이 원인일 수 있습니다.
Visual C++의 규칙과 관련된 문제에 대한 자세한 내용은 Nonstandard Behavior을 참조하세요.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.
구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.
포함
/Zc:strictStrings
하도록 추가 옵션 속성을 수정한 다음 확인을 선택합니다.