Поделиться через


/Zc:strictStrings (Отключение преобразования строковых литеральных типов)

Если этот параметр указан, компилятор требует строгого соответствия const-квалификации для указателей, инициализированных с помощью строковых литералов.

Синтаксис

/Zc:strictStrings[-]

Замечания

Если /Zc:strictStrings задано, компилятор применяет стандартную квалификацию C++ const для строковых литералов в виде типа "массив" или "массивconst 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 компилятор сообщает как об ошибке.

Примечание.

Стандартная библиотека C++ в Visual Studio 2013 не поддерживает параметр компилятора /Zc:strictStrings в отладочных сборках. Если в выходных данных сборки отображается несколько ошибок C2665 , это может быть причиной.

Дополнительные сведения о вопросах соответствия в Visual C++ см. в статье Nonstandard Behavior.

Установка данного параметра компилятора в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.

  3. Измените свойство "Дополнительные параметры", чтобы включить /Zc:strictStrings и нажмите кнопку "ОК".

См. также

/Zc (Соответствие)