/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
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.
Selecione a página de propriedades Propriedades de Configuração>C/C++>Linha de Comando.
Modifique a propriedade Opções Adicionais para incluir
/Zc:strictStrings
e selecione OK.