Поделиться через


Предупреждение компилятора (уровень 3) C4996

Обновлен: Ноябрь 2007

Сообщение об ошибке

"функция": объявлена устаревшей
'function': was declared deprecated

Компилятор обнаружил функцию, которая была помечена как устаревшая — deprecated. Функция может не поддерживаться в будущих выпусках. Это предупреждение можно отключить с помощью прагма-директивы warning (см. пример ниже).

Предупреждение C4996 возникает в строке, в которой объявляется функция, и в строке, в которой эта функция используется.

Предупреждение C4996 можно увидеть при использовании членов файлов заголовков <hash_map> и <hash_set> в пространстве имен std. Дополнительные сведения см. в разделе Пространство имен stdext.

Некоторые функции библиотеки CRT и стандартной библиотеки C++ устарели, и им следует предпочесть новые, более безопасные функции. Дополнительные сведения об устаревших функциях см. в разделах Security Enhancements in the CRT и Safe Libraries: Standard C++ Library.

Предупреждение C4996 также может возникать при использовании функций библиотек MFC или ATL, не рекомендуемых к использованию по соображениям безопасности. Дополнительные сведения о том, как подавить эти предупреждения, см. в разделах _AFX_SECURE_NO_WARNINGS и _ATL_SECURE_NO_WARNINGS.

Предупреждение C4996 также может возникать и при использовании библиотеки маршалинга. В этом случае C4996 будет ошибкой, а не предупреждением. Эта ошибка будет возникать при использовании функции marshal_as для выполнения такого преобразования одного типа данных в другой, которое на самом деле выполняется с помощью marshal_context Class. Также эта ошибка будет возникать в случае, когда библиотека маршалинга не поддерживает преобразование. Дополнительные сведения о библиотеке маршалинга см. в разделе Overview of Marshaling in C++.

Пример

Следующий пример приводит к возникновению предупреждения 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 также может возникать, если при компиляции с параметром _SECURE_SCL 1 не используется проверяемый итератор. Дополнительные сведения см. в разделе Checked Iterators.

Следующий пример приводит к возникновению предупреждения 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
}

Следующий пример приводит к возникновению предупреждения C4996, поскольку библиотеке маршалинга и для преобразования из System::String в 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;
}