Compilerwarnung (Stufe 3) C4996

'Funktion': wurde als veraltet deklariert

Der Compiler hat eine Funktion gefunden, die mit deprecated gekennzeichnet war. Die Funktion wird in zukünftigen Versionen u. U. nicht mehr unterstützt. Sie können diese Warnung mit dem Pragma warning deaktivieren (nachfolgendes Beispiel).

C4996 wird für die Zeile generiert, in der die Funktion deklariert wird, sowie für die Zeile, in der die Funktion verwendet wird.

C4996 wird beispielsweise bei Verwendung von Membern aus den Headerdateien <hash_map> und <hash_set> im std-Namespace ausgegeben. Weitere Informationen finden Sie unter Der stdext-Namespace.

Einige CRT-Funktionen und C++-Standardbibliotheksfunktionen wurden zugunsten von neuen, sichereren Funktionen nicht mehr implementiert. Weitere Informationen über veraltete Funktionen finden Sie unter Security Features in the CRT und unter Safe Libraries: Standard C++ Library.

C4996 kann auch bei der Verwendung von MFC-Funktionen oder ATL-Funktionen auftreten, die aus Sicherheitsgründen nicht mehr implementiert wurden. Weitere Informationen zum Unterdrücken dieser Warnungen finden Sie unter _AFX_SECURE_NO_WARNINGS und _ATL_SECURE_NO_WARNINGS.

C4996 kann auch auftreten, wenn Sie die Marshallingbibliothek verwenden. In diesem Fall ist C4996 ein Fehler, keine Warnung. Dieser Fehler tritt auf, wenn Sie marshal_as für die Konvertierung zwischen zwei Datentypen verwenden, die eine marshal_context Class benötigen. Der Fehler wird auch angezeigt, wenn die Marshallingbibliothek keine Konvertierung unterstützt. Weitere Informationen über die Marshallingbibliothek finden Sie unter Overview of Marshaling in C++.

Beispiel

Im folgenden Beispiel wird C4996 generiert.

// 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 kann auch auftreten, wenn beim Kompilieren mit _SECURE_SCL 1 kein überprüfter Iterator verwendet wurde. Weitere Informationen finden Sie unter Checked Iterators.

Im folgenden Beispiel wird C4996 generiert.

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

Im folgenden Beispiel wird C4996 generiert, weil die Marshallingbibliothek einen Kontext benötigt, um von System::String in const char * zu konvertieren.

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