Compartir a través de


Advertencia del compilador (nivel 3) C4996

'función': el símbolo se ha declarado obsoleto

El compilador encontró una función marcada con deprecated.Puede que la función deje de ser compatible en futuras versiones.Se puede evitar esta advertencia mediante pragma warning (ver ejemplo a continuación).

Se genera la advertencia C4996 para la línea donde se declara la función y la línea en la que se utiliza la función.

La advertencia C4996 se obtiene si se utilizan miembros de los archivos de encabezado <hash_map> y <hash_set> en el espacio de nombres std.Vea El espacio de nombres stdext para obtener más información.

Algunas funciones de la biblioteca estándar de C++ y CRT han quedado obsoletas en beneficio de funciones nuevas más seguras.Para obtener más información acerca de las funciones obsoletas, vea Características de seguridad en CRT y Bibliotecas seguras: biblioteca estándar de C++.

C4996 también se puede producir si se utilizan funciones MFC o ATL que quedaron obsoletas por razones de seguridad.Para suprimir estas advertencias, vea _AFX_SECURE_NO_WARNINGS y _ATL_SECURE_NO_WARNINGS.

C4996 también puede ocurrir al utilizar la biblioteca de cálculo de referencias.En este caso, C4996 es un error y no una advertencia.Este error se producirá al utilizar marshal_as para convertir entre dos tipos de datos que requieren una marshal_context (Clase).También recibirá este error cuando la biblioteca de cálculo de referencias no admita una conversión.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++.

Ejemplo

En el ejemplo siguiente, se genera el error C4996.

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

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

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

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

C4996 también se puede producir si no se usa un iterador comprobado al compilar con _SECURE_SCL 1.Vea Iteradores comprobados para obtener más información.

En el ejemplo siguiente, se genera el error C4996.

// C4996_b.cpp
// compile with: /EHsc /W3 /c
#define _SECURE_SCL 1
#include <algorithm>
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, b);
   copy(a, a + 3, checked_array_iterator<int *>(b, 3));   // OK
}

El ejemplo siguiente genera el error C4996 debido a que la biblioteca de cálculo de referencias exige un contexto para convertir de System::String a un 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;
}