編譯器警告 (層級 3) C4996
'function' : 已經宣告為取代
編譯器遇到標記為 deprecated 的函式。 未來的版本可能不再支援此函式。 您可以使用 warning pragma 關閉此警告 (下面的範例)。
宣告函式的程式行及使用函式的程式行會產生 C4996。
如果您在 std 命名空間中使用 <hash_map> 和 <hash_set> 標頭檔 (Header File) 的成員,您將會看到 C4996。 如需詳細資訊,請參閱 stdext 命名空間。
有些 CRT 函式和 Standard C++ 程式庫函式已經由更安全的新函式取代。 如需已遭取代函式的詳細資訊,請參閱 安全性功能,則在 CRT 中和安全的程式庫: 標準 C++ 程式庫。
如果您使用因安全考量而被取代的 MFC 或 ATL 函式,也可能會發生 C4996。 若要抑制這些警告,請參閱 _AFX_SECURE_NO_WARNINGS 和 _ATL_SECURE_NO_WARNINGS。
當您使用封送處理 (Marshaling) 程式庫時,也可能會發生 C4996 錯誤。 在此情況下,C4996 是錯誤而非警告。 當您使用 marshal_as 在兩個需要 marshal_context 類別 的資料型別之間進行轉換時,將會發生這個錯誤。 當封送處理不支援某項轉換時,也會發生這個錯誤。 如需封送處理程式庫的詳細資訊,請參閱 在 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);
}
如果您在以 _SECURE_SCL 1 編譯時,不使用已核取的 Iterator,也可能會發生 C4996。 如需詳細資訊,請參閱檢查過的 Iterator。
下列範例會產生 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;
}