70

Visual Studio 2005 C++ コンパイラで、コードでfopenなどの呼び出しを使用すると、次の警告が表示されます。

1>foo.cpp(5) : warning C4996: 'fopen' was declared deprecated
1>        c:\program files\microsoft visual studio 8\vc\include\stdio.h(234) : see declaration of 'fopen'
1>        Message: 'This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

これを防ぐにはどうすればよいですか?

4

10 に答える 10

134

Microsoft は、コードのセキュリティを向上させるためにバッファを使用する多くの呼び出しを廃止したようです。ただし、彼らが提供しているソリューションは移植可能ではありません。とにかく、安全なバージョンの呼び出し ( fopen_sなど) を使用することに興味がない場合は、インクルードするヘッダー ファイルの前に_CRT_SECURE_NO_DEPRECATEの定義を配置する必要があります。例えば:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

プリプロセッサ ディレクティブをプロジェクト設定に追加して、プロジェクトの下のすべてのファイルに影響を与えることもできます。これを行うには、_CRT_SECURE_NO_DEPRECATEProject Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitionsに追加します。

于 2008-08-18T09:39:16.510 に答える
31

さてあなたは追加することができます:

#pragma warning (disable : 4996)

fopenを使用する前に、警告が示すようにfopen_sを使用することを検討しましたか?関数呼び出しの結果を確認できるエラーコードを返します。

非推奨の関数警告を無効にするだけの問題は、MicrosoftがCRTの新しいバージョンで問題の関数を削除し、コードを壊す可能性があることです(コメントで後述するように、これはfopenの一部であるため、この場合は発生しませんC&C ++ ISO標準)。

于 2008-08-18T12:18:13.647 に答える
13

これは、マイクロソフトが生意気なだけです。「非推奨」とは、標準化委員会の決定に従って、標準言語/標準ライブラリの将来のバージョンで提供されない可能性がある言語機能を意味します。そのアドバイスがどれほど十分に根拠のあるものであっても、「私たちは一方的に、あなたがそれを使用すべきではないと考えています」という意味ではありませんし、意味するべきでもありません。

于 2008-11-12T17:34:49.640 に答える
10

コードが別の OS (Mac OS X、Linux など) 向けである場合は、次を使用できます。

#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif
于 2011-11-09T18:02:20.830 に答える
4

glibapache ポータブル ランタイムなどの移植性ライブラリの使用を検討してください。これらは通常、このような呼び出しに代わる安全でポータブルな代替手段を提供します。これらの安全でない呼び出しは、ほとんどの最新の環境では推奨されていないため、これも良いことです。

于 2008-09-18T11:15:58.880 に答える
1

多くのプラットフォームで使用したい場合は、次のようなコメント付きの使用定義を使用できます。

#if defined(_MSC_VER) || defined(WIN32)  || defined(_WIN32) || defined(__WIN32__) \
                        || defined(WIN64)    || defined(_WIN64) || defined(__WIN64__) 

        errno_t err = fopen_s(&stream,name, "w");

#endif

#if defined(unix)        || defined(__unix)      || defined(__unix__) \
                        || defined(linux)       || defined(__linux)     || defined(__linux__) \
                        || defined(sun)         || defined(__sun) \
                        || defined(BSD)         || defined(__OpenBSD__) || defined(__NetBSD__) \
                        || defined(__FreeBSD__) || defined __DragonFly__ \
                        || defined(sgi)         || defined(__sgi) \
                        || defined(__MACOSX__)  || defined(__APPLE__) \
                        || defined(__CYGWIN__) 

        stream = fopen(name, "w");

#endif
于 2015-02-24T09:57:23.680 に答える
1

Visual Studio 2017 バージョンを使用している場合、安全でない操作を実行するために必要なプリプロセッサの定義が変更されたようです。代わりに使用してください:

#define _CRT_SECURE_NO_WARNINGS

するとコンパイルされます。

于 2017-03-20T16:03:40.323 に答える
0

私も同じ問題を抱えています。opencv ライブラリを追加しようとすると

#include <opencv\cv.h>

警告ではなくエラーが発生しました。

error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    c:\program files (x86)\opencv\build\include\opencv2\flann\logger.h  

前述のプリプロセッサ ディレクティブも使用しました。しかし、それは問題を解決しませんでした。

次のようにして解決しました。

  • [プロパティ] -> [C/C++] -> [プリコンパイル済みヘッダー] -> [プリコンパイル済みヘッダーでプリコンパイル済みヘッダーを使用しない] を選択します。
于 2014-12-30T17:10:55.423 に答える