Visual Studio 2017 を使用することをお勧めします

コンパイラの警告 (レベル 3) C4996

 

公開日: 2016年7月

Visual Studio 2017 RC の最新のドキュメントの詳細については、Visual Studio 2017 RC ドキュメントをご参照ください。

使用されていない宣言をコンパイラが検出しました。

この警告またはエラーには、いくつかの意味が考えられます。

C4996関数または変数としてマークされている、コンパイラが検出すると発生廃止します。 Visual Studio のライブラリには、使用されていないというマークが付いた関数、メンバー関数、テンプレート関数、グローバル変数がいくつかあります。 そのような関数としては、別の優先名があるもの、セキュリティで保護されていないかより安全なバリアントがあるもの、または古いものがあります。 使用されていない関数またはグローバル変数に代えて使用できる修正候補がエラー メッセージに示される可能性があります。 この警告は、 warning プラグマまたは /wd4996 コマンド ライン オプションを使用するとオフにできます。 使用されなくなったものに関する警告の特定のクラスをオフにするために、プリプロセッサ マクロを使用することもできます。

この項目の POSIX 名が使用されていません。代わりに、ISO C および C++ に準拠する名前を使用します。 new_nameします。詳細については、オンライン ヘルプを参照してください。

CRT の一部の POSIX 関数は、実装定義のグローバル関数名に関する C99 と C++03 の規則に合わせて名前が変更されました。 ほとんどの場合、標準準拠の名前を作成するため POSIX 関数名の先頭にアンダースコアが追加されています。 コンパイラは、元の関数名は使用されなくなったとの警告を発し、優先名を提案します。 使用されていないのは元の名前だけであり、関数自体ではありません。 これらの関数が使用されなくなったとの警告をオフにするには、プリプロセッサ マクロ _CRT_NONSTDC_NO_WARNINGSを定義します。 コマンド ラインでオプション /D_CRT_NONSTDC_NO_WARNINGSを含めれば、これを定義できます。 Visual Studio でこのマクロを定義するには、プロジェクトの [プロパティ ページ] ダイアログを開きます。 [構成プロパティ][C/C++][プリプロセッサ]を順に展開します。 [プリプロセッサの定義]で、 _CRT_NONSTDC_NO_WARNINGSを追加します。 [OK] を選んで保存し、プロジェクトをリビルドします。 特定のソース ファイルでのみこのマクロを定義するには、ヘッダー ファイルをインクルードするすべての行の前に行 #define _CRT_NONSTDC_NO_WARNINGS を追加します。

この関数または変数がセーフでない可能性があります。使用を検討してsafe_version代わりにします。使用されなくなったことの警告を無効にするには、_CRT_SECURE_NO_WARNINGS を使用します。詳細については、オンライン ヘルプを参照してください。

セキュリティが強化された新しい関数が優先されるので、一部の CRT 関数と標準 C++ ライブラリ関数およびグローバルは使用されなくなっています。 コンパイラは、これらの関数は使用されなくなったとの警告を発し、優先関数を提案します。 CRT のこれらの関数が使用されなくなったとの警告をオフにするには、 _CRT_SECURE_NO_WARNINGSを定義します。 使用されていないグローバル変数に関する警告をオフにするには、 _CRT_SECURE_NO_WARNINGS_GLOBALSを定義します。 これらの非推奨の関数およびグローバル変数の詳細については、次を参照してください。 CRT のセキュリティ機能安全なライブラリ: C++ 標準ライブラリします。

関数の呼び出しを安全でない可能性がありますパラメーターを使用してこの呼び出しは、渡された値が正しいことを確認する呼び出し元に依存します。この警告を無効にするには、-D_SCL_SECURE_NO_WARNINGS を使用します。Visual C 'チェック反復子' を使用する方法についてのドキュメントを参照してください。

C++ 標準ライブラリの一部のテンプレート関数は、パラメーターが正しいかどうかをチェックしません。 そのような関数が使用されていることをこの警告で識別できます。 これらの関数の警告をオフにするには、 _SCL_SECURE_NO_WARNINGSを定義します。 詳細については、「 Checked Iterators」を参照してください。

この関数または変数は、ライブラリまたはオペレーティング システムの新機能が提供されています。使用を検討してnew_item()代わりにします。詳細については、オンライン ヘルプを参照してください。

一部のライブラリ関数およびグローバル変数は古いため使用されていません。 これらの関数および変数は、将来のバージョンのライブラリでは削除される可能性があります。 コンパイラは、これらの項目は使用されなくなったとの警告を発行し、優先すべき代替項目を提案します。 これらの項目が使用されなくなったとの警告をオフにするには、 _CRT_OBSOLETE_NO_WARNINGSを定義します。 詳しくは、使用されていない関数または変数のドキュメントをご覧ください。

MFC または ATL のコードでさまざまなメッセージ

C4996 は、セキュリティ上の理由から使用されなくなった MFC 関数または ATL 関数を使用している場合にも発生することがあります。 これらの警告が表示されないようにするには、「 _AFX_SECURE_NO_WARNINGS 」および「 _ATL_SECURE_NO_WARNINGS」をご覧ください。

CLR コード内のエラーをマーシャ リング

C4996 は、マーシャリング ライブラリを使用しているときも発生します。 この場合、C4996 はエラーであり、警告ではありません。 このエラーは、 marshal_as を使用して marshal_context Classを必要とする&2; つのデータ型間で変換を行うときに発生します。 マーシャリング ライブラリが変換をサポートしていないときにもこのエラーが発生します。 マーシャリング ライブラリについて詳しくは、「 Overview of Marshaling in C++」をご覧ください。

C4996 を生成する例

最初の例では、関数が宣言されている行と関数が使用されている行に対して C4996 が生成されます。

次の例では 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 は、 _ITERATOR_DEBUG_LEVEL を定義してコンパイルするときに、チェックを行う反復子を使用しない場合にも発生することがあります (デバッグ モードのビルドでは既定で 1 に設定)。 詳細については、「 Checked Iterators 」を参照してください。

次の STL コード例では、C4996 が生成されます。

// C4996_b.cpp  
// compile with: /EHsc /W3 /c  
#define _ITERATOR_DEBUG_LEVEL 1  
  
#include <algorithm>  
#include <iterator>  
  
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  
}  
  

次の STL コード例では、C4996 が警告として生成されます。 コメントはインラインです。

#include <algorithm>  
#include <array>  
#include <iostream>  
#include <iterator>  
#include <numeric>  
#include <string>  
#include <vector>  
  
using namespace std;  
  
template <typename C> void print(const string& s, const C& c) {  
    cout << s;  
  
    for (const auto& e : c) {  
        cout << e << " ";  
    }  
  
    cout << endl;  
}  
  
int main()  
{  
    vector<int> v(16);  
    iota(v.begin(), v.end(), 0);  
    print("v: ", v);  
  
    // OK: vector::iterator is checked in debug mode  
    // (i.e. an overrun will trigger a debug assertion)  
    vector<int> v2(16);  
    transform(v.begin(), v.end(), v2.begin(), [](int n) { return n * 2; });  
    print("v2: ", v2);  
  
    // OK: back_insert_iterator is marked as checked in debug mode  
    // (i.e. an overrun is impossible)  
    vector<int> v3;  
    transform(v.begin(), v.end(), back_inserter(v3), [](int n) { return n * 3; });  
    print("v3: ", v3);  
  
    // OK: array::iterator is checked in debug mode  
    // (i.e. an overrun will trigger a debug assertion)  
    array<int, 16> a4;  
    transform(v.begin(), v.end(), a4.begin(), [](int n) { return n * 4; });  
    print("a4: ", a4);  
  
    // OK: Raw arrays are checked in debug mode  
    // (i.e. an overrun will trigger a debug assertion)  
    // NOTE: This applies only when raw arrays are given to STL algorithms!  
    int a5[16];  
    transform(v.begin(), v.end(), a5, [](int n) { return n * 5; });  
    print("a5: ", a5);  
  
    // WARNING C4996: Pointers cannot be checked in debug mode  
    // (i.e. an overrun will trigger undefined behavior)  
    int a6[16];  
    int * p6 = a6;  
    transform(v.begin(), v.end(), p6, [](int n) { return n * 6; });  
    print("a6: ", a6);  
  
    // OK: stdext::checked_array_iterator is checked in debug mode  
    // (i.e. an overrun will trigger a debug assertion)  
    int a7[16];  
    int * p7 = a7;  
    transform(v.begin(), v.end(), stdext::make_checked_array_iterator(p7, 16), [](int n) { return n * 7; });  
    print("a7: ", a7);  
  
    // WARNING SILENCED: stdext::unchecked_array_iterator is marked as checked in debug mode  
    // (i.e. it performs no checking, so an overrun will trigger undefined behavior)  
    int a8[16];  
    int * p8 = a8;  
    transform(v.begin(), v.end(), stdext::make_unchecked_array_iterator(p8), [](int n) { return n * 8; });  
    print("a8: ", a8);  
}  
  

次の例では、マーシャリング ライブラリが System::Stringconst 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;  
}  

表示: