ADVERTENCIA del compilador (nivel 3) C4996Compiler Warning (level 3) C4996

El código usa una función, un miembro de clase, una variable o una definición de tipo que está marcada como desusada.Your code uses a function, class member, variable, or typedef that's marked deprecated. Los símbolos están desusados mediante un __declspec(deprecated) modificador o el atributo de c++ 14 [[deprecated]] .Symbols are deprecated by using a __declspec(deprecated) modifier, or the C++14 [[deprecated]] attribute. El mensaje de advertencia C4996 real se especifica mediante el deprecated modificador o el atributo de la declaración.The actual C4996 warning message is specified by the deprecated modifier or attribute of the declaration.

Importante

Esta advertencia siempre es un mensaje deliberado del autor del archivo de encabezado que declara el símbolo.This warning is always a deliberate message from the author of the header file that declares the symbol. No utilice el símbolo en desuso sin conocer las consecuencias.Don't use the deprecated symbol without understanding the consequences.

ObservacionesRemarks

Muchas funciones, funciones miembro, funciones de plantilla y variables globales de las bibliotecas de Visual Studio están desusadas.Many functions, member functions, template functions, and global variables in Visual Studio libraries are deprecated. Algunos, como POSIX y las funciones específicas de Microsoft, están desusados porque ahora tienen un nombre preferido diferente.Some, such as POSIX and Microsoft-specific functions, are deprecated because they now have a different preferred name. Algunas funciones de la biblioteca en tiempo de ejecución de C están desusadas porque no son seguras y tienen una variante más segura.Some C runtime library functions are deprecated because they're insecure and have a more secure variant. Otras están desusadas porque están obsoletas.Others are deprecated because they're obsolete. Los mensajes de degradación suelen incluir un reemplazo sugerido para la función o variable global en desuso.The deprecation messages usually include a suggested replacement for the deprecated function or global variable.

Desactivar la advertenciaTurn off the warning

Para corregir un problema de C4996, normalmente se recomienda cambiar el código.To fix a C4996 issue, we usually recommend you change your code. En su lugar, use las funciones sugeridas y las variables globales.Use the suggested functions and global variables instead. Si necesita usar las funciones o variables existentes por motivos de portabilidad, puede desactivar la advertencia.If you need to use the existing functions or variables for portability reasons, you can turn off the warning.

Desactivar la advertencia para una línea de código específicaTurn off the warning for a specific line of code

Para desactivar la advertencia para una línea de código concreta, use la warning Directiva pragma, #pragma warning(suppress : 4996) .To turn off the warning for a specific line of code, use the warning pragma, #pragma warning(suppress : 4996).

Desactivar la advertencia en un archivoTurn off the warning within a file

Para desactivar la advertencia en un archivo para todo lo que se muestra a continuación, use la pragma warning, #pragma warning(disable : 4996) .To turn off the warning within a file for everything that follows, use the warning pragma, #pragma warning(disable : 4996).

Desactivar la advertencia en compilaciones de línea de comandosTurn off the warning in command-line builds

Para desactivar la advertencia globalmente en compilaciones de línea de comandos, use la /wd4996 opción de línea de comandos.To turn off the warning globally in command-line builds, use the /wd4996 command-line option.

Desactivar la advertencia para un proyecto en Visual StudioTurn off the warning for a project in Visual Studio

Para desactivar la advertencia para un proyecto completo en el IDE de Visual Studio:To turn off the warning for an entire project in the Visual Studio IDE:

  1. Abra el cuadro de diálogo páginas de propiedades del proyecto.Open the Property Pages dialog for your project. Para obtener información sobre cómo usar el cuadro de diálogo páginas de propiedades, vea páginas de propiedades.For information on how to use the Property Pages dialog, see Property Pages.

  2. Seleccione la página de propiedades opciones de configuración > avanzadas deC/C++ > Advanced .Select the Configuration Properties > C/C++ > Advanced property page.

  3. Edite la propiedad deshabilitar advertencias específicas para agregar 4996 .Edit the Disable Specific Warnings property to add 4996. Elija Aceptar para aplicar los cambios.Choose OK to apply your changes.

Deshabilitar la advertencia mediante macros de preprocesadorDisable the warning using preprocessor macros

También puede usar macros de preprocesador para desactivar determinadas clases específicas de advertencias de desuso usadas en las bibliotecas.You can also use preprocessor macros to turn off certain specific classes of deprecation warnings used in the libraries. Estas macros se describen a continuación.These macros are described below.

Para definir una macro de preprocesador en Visual Studio:To define a preprocessor macro in Visual Studio:

  1. Abra el cuadro de diálogo páginas de propiedades del proyecto.Open the Property Pages dialog for your project. Para obtener información sobre cómo usar el cuadro de diálogo páginas de propiedades, vea páginas de propiedades.For information on how to use the Property Pages dialog, see Property Pages.

  2. Expanda propiedades de configuración > C/C++ > preprocesador.Expand Configuration Properties > C/C++ > Preprocessor.

  3. En la propiedad definiciones de preprocesador , agregue el nombre de la macro.In the Preprocessor Definitions property, add the macro name. Seleccione Aceptar para guardar y, luego, vuelva a generar el proyecto.Choose OK to save, and then rebuild your project.

Para definir una macro solo en archivos de código fuente específicos, agregue una línea como #define EXAMPLE_MACRO_NAME antes de cualquier línea que incluya un archivo de encabezado.To define a macro only in specific source files, add a line such as #define EXAMPLE_MACRO_NAME before any line that includes a header file.

Estos son algunos de los orígenes comunes de errores y advertencias de C4996:Here are some of the common sources of C4996 warnings and errors:

Nombres de funciones POSIXPOSIX function names

The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new-name. See online help for details.The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new-name. See online help for details.

Microsoft ha cambiado el nombre de algunas funciones de biblioteca POSIX y específicas de Microsoft en CRT para cumplir las restricciones de C99 y C++ 03 en los nombres reservados y globales definidos por la implementación.Microsoft renamed some POSIX and Microsoft-specific library functions in the CRT to conform with C99 and C++03 constraints on reserved and global implementation-defined names. Solo los nombres están en desuso, no las propias funciones.Only the names are deprecated, not the functions themselves. En la mayoría de los casos, se agregó un carácter de subrayado inicial al nombre de la función para crear un nombre conforme.In most cases, a leading underscore was added to the function name to create a conforming name. El compilador emite una advertencia de desuso para el nombre de función original y sugiere el nombre preferido.The compiler issues a deprecation warning for the original function name, and suggests the preferred name.

Para corregir este problema, normalmente se recomienda cambiar el código para usar los nombres de función sugeridos en su lugar.To fix this issue, we usually recommend you change your code to use the suggested function names instead. Sin embargo, los nombres actualizados son específicos de Microsoft.However, the updated names are Microsoft-specific. Si necesita usar los nombres de función existentes por motivos de portabilidad, puede desactivar estas advertencias.If you need to use the existing function names for portability reasons, you can turn off these warnings. Las funciones siguen estando disponibles en la biblioteca bajo sus nombres originales.The functions are still available in the library under their original names.

Para desactivar las advertencias sobre desuso para estas funciones, defina la macro de preprocesador _CRT_NONSTDC_NO_WARNINGS .To turn off deprecation warnings for these functions, define the preprocessor macro _CRT_NONSTDC_NO_WARNINGS. Puede definir esta macro en la línea de comandos si incluye la opción /D_CRT_NONSTDC_NO_WARNINGS .You can define this macro at the command line by including the option /D_CRT_NONSTDC_NO_WARNINGS.

Funciones de la biblioteca CRT no seguraUnsafe CRT Library functions

This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Microsoft ha dejado de usar algunas funciones de la biblioteca estándar de CRT y C++, así como las versiones más seguras.Microsoft deprecated some CRT and C++ Standard Library functions and globals because more secure versions are available. La mayoría de las funciones en desuso permiten el acceso de lectura o escritura no comprobada a los búferes.Most of the deprecated functions allow unchecked read or write access to buffers. Su uso incorrecto puede dar lugar a graves problemas de seguridad.Their misuse can lead to serious security issues. El compilador emite una advertencia de desuso para estas funciones y sugiere la función preferida.The compiler issues a deprecation warning for these functions, and suggests the preferred function.

Para corregir este problema, se recomienda usar la función o la variable safe-version en su lugar.To fix this issue, we recommend you use the function or variable safe-version instead. A veces no se puede, por motivos de portabilidad o de compatibilidad con versiones anteriores.Sometimes you can't, for portability or backwards compatibility reasons. Compruebe detenidamente que no es posible que se produzca una sobrescritura de búfer o una sobrelectura en el código.Carefully verify it's not possible for a buffer overwrite or overread to occur in your code. Después, puede desactivar la advertencia.Then, you can turn off the warning.

Para desactivar las advertencias sobre desuso para estas funciones en CRT, defina _CRT_SECURE_NO_WARNINGS .To turn off deprecation warnings for these functions in the CRT, define _CRT_SECURE_NO_WARNINGS.

Para desactivar las advertencias sobre variables globales en desuso, defina _CRT_SECURE_NO_WARNINGS_GLOBALS .To turn off warnings about deprecated global variables, define _CRT_SECURE_NO_WARNINGS_GLOBALS.

Para obtener más información sobre estas funciones y variables globales en desuso, vea características de seguridad de CRT y bibliotecas seguras: biblioteca estándar de C++.For more information about these deprecated functions and globals, see Security Features in the CRT and Safe Libraries: C++ Standard Library.

Funciones de la biblioteca estándar no seguraUnsafe Standard Library functions

'std:: function_name ::_Unchecked_iterators::_Deprecate' Call to std:: function_name with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators''std:: function_name ::_Unchecked_iterators::_Deprecate' Call to std:: function_name with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'

En Visual Studio 2015, esta advertencia aparece en las compilaciones de depuración porque ciertas funciones de plantilla de la biblioteca estándar de C++ no comprueban los parámetros para determinar si son correctos.In Visual Studio 2015, this warning appears in debug builds because certain C++ Standard Library template functions don't check parameters for correctness. A menudo, esto se debe a que no hay suficiente información disponible para que la función Compruebe los límites del contenedor.Often it's because not enough information is available to the function to check container bounds. O bien, dado que los iteradores se pueden usar incorrectamente con la función.Or, because iterators may be used incorrectly with the function. Esta advertencia le ayuda a identificar estas funciones, ya que pueden ser una fuente de vulnerabilidades de seguridad serias en el programa.This warning helps you identify these functions, because they may be a source of serious security holes in your program. Para obtener más información, vea iteradores comprobados.For more information, see Checked iterators.

Por ejemplo, esta advertencia aparece en modo de depuración si se pasa un puntero de elemento a std::copy , en lugar de una matriz sin formato.For example, this warning appears in Debug mode if you pass an element pointer to std::copy, instead of a plain array. Para corregir este problema, use una matriz declarada correctamente, de modo que la biblioteca pueda comprobar las extensiones de la matriz y realizar la comprobación de los límites.To fix this issue, use an appropriately declared array, so the library can check the array extents and do bounds checking.

// C4996_copyarray.cpp
// compile with: cl /c /W4 /D_DEBUG C4996_copyarray.cpp
#include <algorithm>

void example(char const * const src) {
    char dest[1234];
    char * pdest3 = dest + 3;
    std::copy(src, src + 42, pdest3); // C4996
    std::copy(src, src + 42, dest);   // OK, copy can tell that dest is 1234 elements
}

Varios algoritmos de la biblioteca estándar se actualizaron para tener versiones de "intervalo dual" en C++ 14.Several standard library algorithms were updated to have "dual range" versions in C++14. Si usa las versiones de intervalo dual, el segundo intervalo proporciona la comprobación de límites necesaria:If you use the dual range versions, the second range provides the necessary bounds checking:

// C4996_containers.cpp
// compile with: cl /c /W4 /D_DEBUG C4996_containers.cpp
#include <algorithm>

bool example(
    char const * const left,
    const size_t leftSize,
    char const * const right,
    const size_t rightSize)
{
    bool result = false;
    result = std::equal(left, left + leftSize, right); // C4996
    // To fix, try this form instead:
    // result = std::equal(left, left + leftSize, right, right + rightSize); // OK
    return result;
}

En este ejemplo se muestran varias formas más de usar la biblioteca estándar para comprobar el uso de iteradores y, cuando el uso no comprobado puede ser peligroso:This example demonstrates several more ways the standard library may be used to check iterator usage, and when unchecked usage may be dangerous:

// C4996_standard.cpp
// compile with: cl /EHsc /W4 /MDd C4996_standard.cpp
#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <numeric>
#include <string>
#include <vector>

using namespace std;

template <typename C> void print(const string& s, const C& c) {
    cout << s;

    for (const auto& e : c) {
        cout << e << " ";
    }

    cout << endl;
}

int main()
{
    vector<int> v(16);
    iota(v.begin(), v.end(), 0);
    print("v: ", v);

    // OK: vector::iterator is checked in debug mode
    // (i.e. an overrun triggers a debug assertion)
    vector<int> v2(16);
    transform(v.begin(), v.end(), v2.begin(), [](int n) { return n * 2; });
    print("v2: ", v2);

    // OK: back_insert_iterator is marked as checked in debug mode
    // (i.e. an overrun is impossible)
    vector<int> v3;
    transform(v.begin(), v.end(), back_inserter(v3), [](int n) { return n * 3; });
    print("v3: ", v3);

    // OK: array::iterator is checked in debug mode
    // (i.e. an overrun triggers a debug assertion)
    array<int, 16> a4;
    transform(v.begin(), v.end(), a4.begin(), [](int n) { return n * 4; });
    print("a4: ", a4);

    // OK: Raw arrays are checked in debug mode
    // (i.e. an overrun triggers a debug assertion)
    // NOTE: This applies only when raw arrays are
    // given to C++ Standard Library algorithms!
    int a5[16];
    transform(v.begin(), v.end(), a5, [](int n) { return n * 5; });
    print("a5: ", a5);

    // WARNING C4996: Pointers cannot be checked in debug mode
    // (i.e. an overrun triggers undefined behavior)
    int a6[16];
    int * p6 = a6;
    transform(v.begin(), v.end(), p6, [](int n) { return n * 6; });
    print("a6: ", a6);

    // OK: stdext::checked_array_iterator is checked in debug mode
    // (i.e. an overrun triggers a debug assertion)
    int a7[16];
    int * p7 = a7;
    transform(v.begin(), v.end(),
        stdext::make_checked_array_iterator(p7, 16),
        [](int n) { return n * 7; });
    print("a7: ", a7);

    // WARNING SILENCED: stdext::unchecked_array_iterator
    // is marked as checked in debug mode, but it performs no checking,
    // so an overrun triggers undefined behavior
    int a8[16];
    int * p8 = a8;
    transform( v.begin(), v.end(),
        stdext::make_unchecked_array_iterator(p8),
        [](int n) { return n * 8; });
    print("a8: ", a8);
}

Si ha comprobado que el código no puede tener un error de saturación del búfer, puede desactivar esta advertencia.If you've verified that your code can't have a buffer-overrun error, you can turn off this warning. Para desactivar las advertencias para estas funciones, defina _SCL_SECURE_NO_WARNINGS .To turn off warnings for these functions, define _SCL_SECURE_NO_WARNINGS.

Iteradores comprobados habilitadosChecked iterators enabled

C4996 también se puede producir si no se usa un iterador comprobado cuando _ITERATOR_DEBUG_LEVEL se define como 1 o 2.C4996 can also occur if you don't use a checked iterator when _ITERATOR_DEBUG_LEVEL is defined as 1 or 2. Está establecido en 2 de forma predeterminada para las compilaciones en modo de depuración y en 0 para las compilaciones comerciales.It's set to 2 by default for debug mode builds, and to 0 for retail builds. Para obtener más información, vea iteradores comprobados.For more information, see Checked iterators.

// C4996_checked.cpp
// compile with: /EHsc /W4 /MDd C4996_checked.cpp
#define _ITERATOR_DEBUG_LEVEL 2

#include <algorithm>
#include <iterator>

using namespace std;
using namespace stdext;

int main() {
    int a[] = { 1, 2, 3 };
    int b[] = { 10, 11, 12 };
    copy(a, a + 3, b + 1);   // C4996
    // try the following line instead:
    // copy(a, a + 3, checked_array_iterator<int *>(b, 3));   // OK
}

Código MFC o ATL no seguroUnsafe MFC or ATL code

C4996 puede producirse si se utilizan funciones MFC o ATL desusadas por razones de seguridad.C4996 can occur if you use MFC or ATL functions that were deprecated for security reasons.

Para corregir este problema, se recomienda encarecidamente cambiar el código para usar las funciones actualizadas en su lugar.To fix this issue, we strongly recommend you change your code to use updated functions instead.

Para obtener información sobre cómo suprimir estas advertencias, vea _AFX_SECURE_NO_WARNINGS .For information on how to suppress these warnings, see _AFX_SECURE_NO_WARNINGS.

Variables y funciones de CRT obsoletasObsolete CRT functions and variables

This function or variable has been superseded by newer library or operating system functionality. Consider using new_item instead. See online help for details.This function or variable has been superseded by newer library or operating system functionality. Consider using new_item instead. See online help for details.

Algunas variables globales y funciones de la biblioteca están en desuso por estar obsoletas.Some library functions and global variables are deprecated as obsolete. Es posible que estas funciones y variables se quiten en una versión futura de la biblioteca.These functions and variables may be removed in a future version of the library. El compilador emite una advertencia de desuso para estos elementos y sugiere la alternativa preferida.The compiler issues a deprecation warning for these items, and suggests the preferred alternative.

Para corregir este problema, se recomienda cambiar el código para usar la función o variable sugeridas.To fix this issue, we recommend you change your code to use the suggested function or variable.

Para desactivar las advertencias sobre desuso para estos elementos, defina _CRT_OBSOLETE_NO_WARNINGS .To turn off deprecation warnings for these items, define _CRT_OBSOLETE_NO_WARNINGS. Para más información, consulte la documentación de la variable o función en desuso.For more information, see the documentation for the deprecated function or variable.

Serialización de errores en código CLRMarshaling errors in CLR code

C4996 también se puede producir cuando se usa la biblioteca de serialización de CLR.C4996 can also occur when you use the CLR marshaling library. En este caso, C4996 es un error, no una advertencia.In this case, C4996 is an error, not a warning. El error se produce cuando se usa marshal_as para convertir entre dos tipos de datos que requieren una marshal_context clase.The error occurs when you use marshal_as to convert between two data types that require a marshal_context Class. También puede recibir este error cuando la biblioteca de serialización no admite una conversión.You can also receive this error when the marshaling library doesn't support a conversion. Para obtener más información sobre la biblioteca de cálculo de referencias, vea información general sobre el cálculo de referencias en C++.For more information about the marshaling library, see Overview of marshaling in C++.

En este ejemplo se genera C4996 porque la biblioteca de cálculo de referencias requiere un contexto para convertir de System::String a const char * .This example generates C4996 because the marshaling library requires a context to convert from a System::String to a const char *.

// C4996_Marshal.cpp
// compile with: /clr
// C4996 expected
#include <stdlib.h>
#include <string.h>
#include <msclr\marshal.h>

using namespace System;
using namespace msclr::interop;

int main() {
   String^ message = gcnew String("Test String to Marshal");
   const char* result;
   result = marshal_as<const char*>( message );
   return 0;
}

Ejemplo: función desusada definida por el usuarioExample: User-defined deprecated function

Puede usar el deprecated atributo en su propio código para avisar a los autores de llamadas cuando ya no se recomienda el uso de determinadas funciones.You can use the deprecated attribute in your own code to warn callers when you no longer recommend use of certain functions. En este ejemplo, C4996 se genera en dos lugares: uno para la línea en la que se declara la función en desuso y otro para la línea en la que se usa la función.In this example, C4996 is generated in two places: One for the line the deprecated function is declared on, and one for the line where the function is used.

// C4996.cpp
// compile with: /W3
// C4996 warning expected
#include <stdio.h>

// #pragma warning(disable : 4996)
void func1(void) {
   printf_s("\nIn func1");
}

[[deprecated]]
void func1(int) {
   printf_s("\nIn func2");
}

int main() {
   func1();
   func1(1);    // C4996
}