/Zc:strictStrings
(Отключение преобразования строковых литеральных типов)
Если этот параметр указан, компилятор требует строгого соответствия const
-квалификации для указателей, инициализированных с помощью строковых литералов.
Синтаксис
/Zc:strictStrings
[-
]
Замечания
Если /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
компилятор сообщает как об ошибке.
Примечание.
Стандартная библиотека C++ в Visual Studio 2013 не поддерживает параметр компилятора /Zc:strictStrings
в отладочных сборках. Если в выходных данных сборки отображается несколько ошибок C2665 , это может быть причиной.
Дополнительные сведения о вопросах соответствия в Visual C++ см. в статье Nonstandard Behavior.
Установка данного параметра компилятора в среде разработки Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.
Измените свойство "Дополнительные параметры", чтобы включить
/Zc:strictStrings
и нажмите кнопку "ОК".