/Zc:strictStrings (Deshabilitar conversión de tipo de literal de cadena)

Cuando se especifica, el compilador requiere que los punteros inicializados con literales de cadena cumplan estrictamente las cualificaciones de const.

Sintaxis

/Zc:strictStrings[-]

Comentarios

Si se especifica /Zc:strictStrings, el compilador exigirá las cualificaciones de C++ const estándar sobre literales de cadena, como el tipo "matriz de const char" o "matriz de const wchar_t", según la declaración. Los literales de cadena son inmutables, y si trata de modificar el contenido de uno, se producirá un error de infracción de acceso en tiempo de ejecución. Debe declarar un puntero de cadena como const para inicializarlo con un literal de cadena o usar una const_cast explícita para inicializar un puntero no const. De forma predeterminada, o si se especifica /Zc:strictStrings-, el compilador no exige las cualificaciones de C++ const estándar sobre punteros de cadena inicializados con literales de cadena.

De forma predeterminada, la opción /Zc:strictStrings está desactivada. La opción del compilador /permissive- establece implícitamente esta opción, pero se puede invalidar mediante /Zc:strictStrings-.

Utilice la opción /Zc:strictStrings para evitar la compilación de código incorrecto. En este ejemplo, se muestra cómo un simple error de declaración provoca un bloqueo en tiempo de ejecución:

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

Cuando /Zc:strictStrings está habilitado, el mismo código informa de un error en la declaración 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';
}

Si usa auto para declarar un puntero de cadena, el compilador creará automáticamente la declaración del tipo de puntero const correcta. Si trata de modificar el contenido de un puntero const, el compilador informará de ello en forma de error.

Nota:

La biblioteca de C++ estándar de Visual Studio 2013 no admite la opción del compilador /Zc:strictStrings en las compilaciones de depuración. Si ve varios errores C2665 en la salida de la compilación, puede que el motivo sea este.

Para obtener más información sobre los problemas de conformidad de Visual C++, vea Nonstandard Behavior.

Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento del compilador de C++ y de propiedades de compilación en Visual Studio.

  2. Seleccione la página de propiedades Propiedades de configuración>C/C++>Línea de comandos.

  3. Modifique la propiedad Opciones adicionales para incluir /Zc:strictStrings y, a continuación, elija Aceptar.

Consulte también

/Zc (Conformidad)