Frage

An Visual Studio 2005 C++-Compiler, erhalte ich die folgende Warnung, wenn mein Code die verwendet fopen und solche Anrufe.

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.'

Wie kann ich das verhindern?

War es hilfreich?

Lösung

Es sieht so aus, als hätte Microsoft viele Aufrufe, die Puffer verwenden, um die Codesicherheit zu verbessern, abgelehnt.Allerdings sind die von ihnen angebotenen Lösungen nicht portabel.Wie auch immer, wenn Sie nicht daran interessiert sind, die sichere Version ihrer Anrufe zu verwenden (wie fopen_s), müssen Sie eine Definition von platzieren _CRT_SECURE_NO_DEPRECATE vor Ihren enthaltenen Header-Dateien.Zum Beispiel:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

Die Präprozessoranweisung kann auch zu Ihren Projekteinstellungen hinzugefügt werden, um sie auf alle Dateien im Projekt anzuwenden.Fügen Sie dazu hinzu _CRT_SECURE_NO_DEPRECATE Zu Projekteigenschaften -> Konfigurationseigenschaften -> C/C++ -> Präprozessor -> Präprozessordefinitionen.

Andere Tipps

Nun, Sie könnten Folgendes hinzufügen:

#pragma warning (disable : 4996)

bevor Sie fopen verwenden, aber haben Sie darüber nachgedacht, fopen_s zu verwenden, wie in der Warnung angegeben?Es gibt einen Fehlercode zurück, mit dem Sie das Ergebnis des Funktionsaufrufs überprüfen können.

Das Problem beim bloßen Deaktivieren von Warnungen zu veralteten Funktionen besteht darin, dass Microsoft möglicherweise die betreffende Funktion in einer späteren Version des CRT entfernt und dadurch Ihren Code beschädigt (wie unten in den Kommentaren angegeben, wird dies in diesem Fall mit fopen nicht passieren, da es Teil von ist die C- und C++-ISO-Standards).

Das ist nur eine Frechheit von Microsoft.„Veraltet“ impliziert eine Sprachfunktion, die in zukünftigen Versionen der Standardsprache/Standardbibliotheken möglicherweise nicht mehr bereitgestellt wird, wie vom Standardkomitee beschlossen.Es bedeutet nicht oder sollte nicht bedeuten: „Wir glauben einseitig nicht, dass Sie es verwenden sollten“, egal wie fundiert dieser Rat ist.

Wenn Ihr Code für ein anderes Betriebssystem (wie Mac OS X, Linux) gedacht ist, können Sie Folgendes verwenden:

#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif

Erwägen Sie die Verwendung einer Portabilitätsbibliothek wie glatt oder der Tragbare Apache-Laufzeitumgebung.Diese bieten normalerweise sichere, tragbare Alternativen zu solchen Anrufen.Das ist auch gut so, denn diese unsicheren Aufrufe werden in den meisten modernen Umgebungen nicht mehr unterstützt.

Ich verwende VisualStdio 2008.In diesem Fall setze ich oft Preprocessor Definitions

Menü \ Projekt \ [Projektname] Eigenschaften...Alt+F7

Wenn Sie auf dieses Menü klicken oder im Projektfenster Alt + F7 drücken, können Sie es sehen „Eigenschaftsseiten“ Fenster.

Dann sehen Sie sich das Menü links im Fenster an.

Konfigurationseigenschaften \ C/C++ \ Präprozessor

Dann füge hinzu _CRT_SECURE_NO_WARNINGS Zu \ Präprozessordefinitionen.

Wenn Sie möchten, dass es auf vielen Plattformen verwendet wird, können Sie wie folgt folgende Definitionen verwenden:

#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

Für diejenigen, die die Visual Studio 2017-Version verwenden, scheint sich die Präprozessordefinition, die zum Ausführen unsicherer Vorgänge erforderlich ist, geändert zu haben.Verwenden Sie stattdessen:

#define _CRT_SECURE_NO_WARNINGS

Es wird dann kompiliert.

Viele der sicheren Funktionen von Microsoft, einschließlich fopen_s(), sind Teil von C11 und sollten daher jetzt portierbar sein.Sie sollten sich darüber im Klaren sein, dass sich die sicheren Funktionen im Ausnahmeverhalten und manchmal auch in den Rückgabewerten unterscheiden.Darüber hinaus müssen Sie sich darüber im Klaren sein, dass diese Funktionen zwar standardisiert sind, es sich jedoch um eine handelt Optional Teil des Standards (Annex K), den zumindest Glibc (Standard unter Linux) und FreeBSDs libc nicht implementieren.

Allerdings kämpfte ich einige Jahre lang mit diesem Problem.Ich habe einen größeren Satz Konvertierungsmakros gepostet Hier., Fügen Sie für Ihr unmittelbares Problem den folgenden Code in eine Include-Datei ein und fügen Sie ihn in Ihren Quellcode ein:

#pragma once
#if !defined(FCN_S_MACROS_H)
   #define   FCN_S_MACROS_H

   #include <cstdio>
   #include <string> // Need this for _stricmp
   using namespace std;

   // _MSC_VER = 1400 is MSVC 2005. _MSC_VER = 1600 (MSVC 2010) was the current
   // value when I wrote (some of) these macros.

   #if (defined(_MSC_VER) && (_MSC_VER >= 1400) )

      inline extern
      FILE*   fcnSMacro_fopen_s(char *fname, char *mode)
      {  FILE *fptr;
         fopen_s(&fptr, fname, mode);
         return fptr;
      }
      #define fopen(fname, mode)            fcnSMacro_fopen_s((fname), (mode))

   #else
      #define fopen_s(fp, fmt, mode)        *(fp)=fopen( (fmt), (mode))

   #endif //_MSC_VER

#endif // FCN_S_MACROS_H

Natürlich implementiert dieser Ansatz nicht das erwartete Ausnahmeverhalten.

Ich habe auch das gleiche Problem.Wenn ich versuche, die opencv-Bibliothek hinzuzufügen

#include <opencv\cv.h>

Ich habe keine Warnung, sondern einen Fehler erhalten.

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  

Ich habe auch die Präprozessoranweisungen wie erwähnt verwendet.Aber das hat das Problem nicht gelöst.

Ich habe es wie folgt gelöst:

  • Gehen Sie zu Eigenschaften -> C/C++ -> Vorkompilierte Header -> Wählen Sie „Keine vorkompilierten Header im vorkompilierten Header verwenden“.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top