Partager via


Avertissement du compilateur (niveau 3) C4996

'fonction' a été déclaré déconseillé

Le compilateur a rencontré une fonction qui était marquée avec deprecated. La fonction ne sera peut-être plus prise en charge dans une future version. Vous pouvez désactiver cet avertissement avec le pragma warning (exemple ci-dessous).

C4996 est généré pour la ligne dans laquelle la fonction est déclarée et pour la ligne dans laquelle la fonction est utilisée.

Vous obtiendrez l'avertissement C4996 si vous utilisez des membres des fichiers d'en-tête <hash_map> et <hash_set> dans l'espace de noms std. Pour plus d'informations, consultez The stdext Namespace.

Certaines fonctions CRT et de la bibliothèque C++ standard ont été déconseillées en faveur de nouvelles fonctions, plus sécurisées. Pour plus d'informations sur les fonctions déconseillées, consultez Security Features in the CRT et Safe Libraries: Standard C++ Library.

L'erreur C4996 peut également se produire si vous utilisez des fonctions MFC ou ATL qui ont été déconseillées pour des raisons de sécurité. Pour supprimer ces avertissements, consultez _AFX_SECURE_NO_WARNINGS et _ATL_SECURE_NO_WARNINGS.

L'erreur C4996 peut également se produire lorsque vous utilisez la bibliothèque de marshaling. Dans ce cas, C4996 est une erreur, plutôt qu'un avertissement. Elle intervient si vous utilisez marshal_as pour effectuer une conversion entre deux types de données qui requièrent une marshal_context Class. Vous recevez également cette erreur lorsque la bibliothèque de marshaling ne prend pas de conversion en charge. Pour plus d'informations sur la bibliothèque de marshaling, consultez Overview of Marshaling in C++.

Exemple

L'exemple suivant génère l'erreur 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'erreur C4996 peut également se produire si vous n'utilisez pas d'itérateur vérifié lors de la compilation avec _SECURE_SCL 1. Pour plus d'informations, consultez Checked Iterators.

L'exemple suivant génère l'erreur 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
}

L'exemple suivant génère l'erreur C4996 parce que la bibliothèque de marshaling a besoin d'un contexte pour effectuer une conversion de System::String en 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;
}