Condividi tramite


Avviso del compilatore (livello 3) C4996

'funzione': è stato dichiarato obsoleto

È stata rilevata una funzione contrassegnata con deprecated. È possibile che tale funzione non sia più supportata in una versione futura. Disattivare l'avviso con il pragma warning, come illustrato nell'esempio seguente.

L'avviso C4996 viene generato per la riga in cui la funzione viene dichiarata e per la riga in cui la funzione viene utilizzata.

L'avviso C4996 viene generato se si utilizzano membri dei file di intestazione <hash_map> e <hash_set>. Per ulteriori informazioni, vedere lo spazio dei nomi stdext.

Alcune funzioni CRT e della libreria C++ standard sono state sostituite da nuove funzioni più sicure. Per ulteriori informazioni sulle funzioni obsolete, vedere Security Features in the CRT e Safe Libraries: Standard C++ Library.

L'avviso C4996 può essere visualizzato anche nel caso in cui vengano utilizzate funzioni MFC o ATL dichiarate obsolete per motivi di sicurezza. Per eliminare questi avvisi, vedere _AFX_SECURE_NO_WARNINGS e _ATL_SECURE_NO_WARNINGS.

Può verificarsi C4996 anche quando si utilizza la libreria del marshalling. In questo caso C4996 rappresenta un errore e non un avviso. Si verificherà questo errore quando si utilizza marshal_as per convertire tra due tipi di dati che richiedono un marshal_context Class. Si riceverà anche questo errore quando la libreria del marshalling non supporta una conversione. Per ulteriori informazioni sulla libreria del marshalling, vedere Overview of Marshaling in C++.

Esempio

Nell'esempio seguente viene generato l'errore 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);
}

‎L'errore C4996 può verificarsi anche quando si esegue la compilazione con _SECURE_SCL 1 senza utilizzare un iteratore verificato. Per ulteriori informazioni, vedere Checked Iterators.

Nell'esempio seguente viene generato l'errore 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
}

Nell'esempio seguente è generato C4996 perché la libreria del marshalling richiede un contesto di convertire da un System::String ad un carattere del const *.

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