Compartilhar via


/Zc:strictStrings (Desabilitar conversão de tipo literal de cadeia de caracteres)

Quando especificado, o compilador exige conformidade rígida com qualificação de const para ponteiros inicializados com literais da cadeia de caracteres.

Sintaxe

/Zc:strictStrings[-]

Comentários

Se /Zc:strictStrings for especificado, o compilador forçará as qualificações const do C++ padrão nos literais de cadeia de caracteres, como o tipo "matriz de const char" ou "matriz de const wchar_t", dependendo da declaração. Os literais da cadeia de caracteres são imutáveis, e uma tentativa de modificar o conteúdo de um resulta em um erro de violação de acesso em tempo de execução. Você deve declarar um ponteiro da cadeia de caracteres como const para inicializá-lo usando um literal da cadeia de caracteres ou usar um const_cast explícito para inicializar um ponteiro não const. Por padrão, ou se /Zc:strictStrings- for especificado, o compilador não vai impor as qualificações de const do C++ padrão em ponteiros da cadeia de caracteres inicializados com literais da cadeia de caracteres.

A opção /Zc:strictStrings é desativada por padrão. A opção do compilador /permissive- define implicitamente essa opção, mas ela pode ser substituída usando /Zc:strictStrings-.

Use a opção /Zc:strictStrings para evitar a compilação de código incorreto. Este exemplo mostra como um erro de declaração simples leva a uma falha em tempo de execução:

// 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
}

Quando /Zc:strictStrings está habilitado, o mesmo código relata um erro na declaração de 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';
}

Se você usar auto para declarar um ponteiro da cadeia de caracteres, o compilador criará a declaração do tipo de ponteiro const correta para você. Uma tentativa de modificar o conteúdo de um ponteiro const é relatada pelo compilador como um erro.

Observação

A Biblioteca Padrão do C++ no Visual Studio 2013 não oferece suporte à opção do compilador /Zc:strictStrings em compilações de depuração. Se você vir diversos erros C2665 na saída da compilação, essa poderá ser a causa.

Para obter mais informações sobre problemas de conformidade no Visual C++, confira Comportamento fora do padrão.

Para definir esta opção do compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter detalhes, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.

  2. Selecione a página de propriedades Propriedades de Configuração>C/C++>Linha de Comando.

  3. Modifique a propriedade Opções Adicionais para incluir /Zc:strictStrings e selecione OK.

Confira também

/Zc (Conformidade)