生成された警告を無効にして、警告_CRT_SECURE_NO_DEPRECATE
を簡単に元に戻し、Visual Studio のバージョン間で機能するようにする最善の方法は何ですか?
10 に答える
ソース コードを汚染したくない場合 (この警告はすべて Microsoft コンパイラでのみ表示されるため)、_CRT_SECURE_NO_WARNINGS
[プロジェクト] -> [プロパティ] -> [構成プロパティ] -> [C/C++] を介してプロジェクト設定にシンボルを追加します。 "->"プリプロセッサ"->"プリプロセッサ定義".
また、この警告を生成するヘッダー ファイルをインクルードする直前に定義することもできます。このようなものを追加する必要があります
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
また、MSVC 以外のコンパイラを使用するつもりがない場合は、より安全なバージョンの関数、つまり strcpy の代わりに strcpy_s を使用することを検討してください。
を使用して、警告が表示される場所で一時的に警告を無効にすることができます
#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)
そのため、すべての警告を無効にすることはできません。これは、場合によっては有害になる可能性があります。
私はマルチプラットフォーム プロジェクトに取り組んでいるので、_s 関数を使用できず、Visual Studio 固有のコードでコードを汚染したくありません。
私の解決策は、ビジュアル スタジオ プロジェクトの警告 4996 を無効にすることです。Project -> Properties -> Configuration properties -> C/C++ -> Advanced -> Disable specific warning に移動し、値 4996 を追加します
。mfc および/または atl ライブラリ (私の場合ではない) も使用する場合は、mfc _AFX_SECURE_NO_DEPRECATE を含める前に定義し、 atl _ATL_SECURE_NO_DEPRECATE を含める前に。
Visual Studio 2003 と 2005 でこのソリューションを使用しています。
ps Visual Studio のみを使用する場合は、安全なテンプレートのオーバーロードが適切な解決策になる可能性があります。
セキュアテンプレートオーバーロードを使用することもできます。これらは、バッファサイズ(静的配列)を簡単に推測できる場所であればどこでも、安全でない呼び出しを安全な呼び出しに置き換えるのに役立ちます。
以下を追加するだけです。
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
次に、_s関数を使用して、残りの警告を手動で修正します。
@[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
警告ごとの警告については、ケースバイケースで行っているため、ある時点でデフォルトに戻すことが賢明です。
#pragma warning(disable: 4996) /* Disable deprecation */
// Code that causes it goes here
#pragma warning(default: 4996) /* Restore default */
これを行う最良の方法は、簡単なチェックと評価です。私は通常次のようなことをします:
#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)
まだ失敗していません。お役に立てれば
_CRT_SECURE_NO_WARNINGS シンボルを定義してそれらを抑制し、定義解除して元に戻すことができます。