コンパイラの警告 (レベル 3) C4996
'function' が古い形式として宣言されました。
deprecated でマークされている関数が見つかりました。この関数は、将来のリリースではサポートされなくなる可能性があります。この警告は、warning プラグマを使用するとオフにできます。以下の例を参照してください。
関数が宣言されている行と関数が使用されている行に対して C4996 警告が生成されます。
C4996 は、<hash_map> ヘッダー ファイルと <hash_set> ヘッダー ファイルのメンバーを std 名前空間で使用している場合に発生します。詳細については、「The stdext Namespace」を参照してください。
セキュリティが強化された新しい関数が優先されるので、一部の CRT 関数および標準 C++ ライブラリ関数は使用されなくなっています。サポートされなくなった関数の詳細については、「CRT のセキュリティ機能」および「安全なライブラリ: 標準 C++ のライブラリ」を参照してください。
C4996 は、セキュリティ上の理由から使用されなくなった MFC 関数または ATL 関数を使用している場合にも発生することがあります。この警告が表示されないようにするには、「_AFX_SECURE_NO_WARNINGS」および「_ATL_SECURE_NO_WARNINGS」を参照してください。
C4996 は、マーシャリング ライブラリを使用しているときも発生します。この場合、C4996 はエラーであり、警告ではありません。このエラーは、marshal_as を使用して marshal_context クラスを必要とする 2 つのデータ型間で変換を行うときに発生します。マーシャリング ライブラリが変換をサポートしていないときにもこのエラーが発生します。マーシャリング ライブラリの詳細については、「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 を指定したコンパイルで、チェックを行う反復子を使用しない場合にも発生することがあります。詳細については、「チェックを行う反復子」を参照してください。
次の例では 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
}
次の例では、マーシャリング ライブラリが、System::String を const char * に変換するのにコンテキストを必要とするため、C4996 エラーが生成されます。
// 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;
}