web-dev-qa-db-ja.com

_CRT_SECURE_NO_DEPRECATEで生成された警告を無効にする

_CRT_SECURE_NO_DEPRECATEを介して生成された警告を無効にする最良の方法は何ですか?これにより、警告を簡単に復元でき、Visual Studioのどのバージョンでも機能しますか?

72
grrussel

ソースコードを汚染したくない場合(この警告はすべてMicrosoftコンパイラでのみ表示されます)、_CRT_SECURE_NO_WARNINGS「プロジェクト」->「プロパティ」->「構成プロパティ」->「C/C++」->「プリプロセッサ」->「プリプロセッサ定義」を使用して、プロジェクト設定にシンボルを追加します。

また、この警告を生成するヘッダーファイルを含める直前に定義することもできます。このようなものを追加する必要があります

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

そして、ほんの少しの発言で、この警告の意味を理解していることを確認してください。おそらく、MSVC以外のコンパイラーを使用するつもりがない場合は、strcpyではなくstrcpy_sなどのより安全なバージョンの関数を使用することを検討してください。

103
Serge

を使用して、表示される場所で一時的に警告を無効にすることができます

#pragma warning(Push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)

そのため、すべての警告を無効にしないでください。これは、時々有害になる可能性があります。

47
macbirdie

私はマルチプラットフォームプロジェクトに取り組んでいるので、_s関数を使用できず、Visual Studio固有のコードでコードを汚染したくありません。
私の解決策は、Visual Studioプロジェクトで警告4996を無効にすることです。 [プロジェクト]-> [プロパティ]-> [構成プロパティ]-> [C/C++]-> [詳細]-> [特定の警告を無効にする]に値4996を追加します。
mfc _AFX_SECURE_NO_DEPRECATEをインクルードする前、およびatl _ATL_SECURE_NO_DEPRECATEをインクルードする前にmfcおよび/またはatlライブラリも使用する場合(私の場合ではありません)に定義します。
iは、Visual Studio 2003と2005でこのソリューションを使用します。

追伸Visual Studioのみを使用する場合は、安全なテンプレートのオーバーロードが適切なソリューションになる可能性があります。

8
conte0

Secure Template Overloads を使用することもできます。バッファサイズ(静的配列)を簡単に推測できる場合は、安全でない呼び出しを安全な呼び出しに置き換えるのに役立ちます。

以下を追加してください:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

次に、_s関数を使用して、残りの警告を手動で修正します。

6
Drealmer

@ [macbirdie]と@ [Adrian Borchardt]の回答の組み合わせ。本番環境で非常に有用であることが証明されています(特にクロスプラットフォームコンパイル中に、既存の警告を台無しにしないでください)

#if (_MSC_VER >= 1400)         // Check MSC version
#pragma warning(Push)
#pragma warning(disable: 4996) // Disable deprecation
#endif 
//...                          // ...
strcat(base, cat);             // Sample depreciated code
//...                          // ...
#if (_MSC_VER >= 1400)         // Check MSC version
#pragma warning(pop)           // Renable previous depreciations
#endif
5
PicoCreator

警告ケースごとの警告については、ケースバイケースで実行しているため、ある時点でデフォルトに戻すのが賢明です。

#pragma warning(disable: 4996) /* Disable deprecation */
// Code that causes it goes here
#pragma warning(default: 4996) /* Restore default */
3

セキュリティチェックを無効にできます。に行きます

プロジェクト->プロパティ->構成プロパティ-> C/C++->コード生成->セキュリティチェック

[セキュリティチェックを無効にする(/ GS-)]を選択します

2
s.c

これを行う最良の方法は、簡単なチェックと評価によるものです。私は通常このようなことをします:

#ifndef _DEPRECATION_DISABLE   /* One time only */
#define _DEPRECATION_DISABLE   /* Disable deprecation true */
#if (_MSC_VER >= 1400)         /* Check version */
#pragma warning(disable: 4996) /* Disable deprecation */
#endif /* #if defined(NMEA_WIN) && (_MSC_VER >= 1400) */
#endif /* #ifndef _DEPRECATION_DISABLE */

本当に必要なのは以下だけです:

#pragma warning(disable: 4996)

まだ失敗していません。お役に立てれば

2

_CRT_SECURE_NO_WARNINGSシンボルを定義してそれらを抑制し、定義を解除して元に戻すことができます。

1
dennisV

別の遅い答え... Microsoftがwchar.h。また、 警告C6386 が無効になっていることに注意してください。

__inline _CRT_INSECURE_DEPRECATE_MEMORY(wmemcpy_s) wchar_t * __CRTDECL
wmemcpy(_Out_opt_cap_(_N) wchar_t *_S1, _In_opt_count_(_N) const wchar_t *_S2, _In_ size_t _N)
{
    #pragma warning( Push )
    #pragma warning( disable : 4996 6386 )
        return (wchar_t *)memcpy(_S1, _S2, _N*sizeof(wchar_t));
    #pragma warning( pop )
} 
0
jww