2014-02-19 7 views
17

Ich erhalte diesen Fehler beim Kompilieren:Fehler "fopen ': Diese Funktion oder Variable ist möglicherweise nicht sicher." wenn compling

'fopen': This function or variable may be unsafe. 
Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. 

Ich bin neu in C++ und offener CV daher bitte helfen Sie mir die Befreiung von diesem Fehler zu erhalten.

Dank

void _setDestination(const char* name) 
{ 
    if (name==NULL) { 
     stream = stdout; 
    } 
    else { 
     stream = fopen(name,"w"); 
     if (stream == NULL) { 
      stream = stdout; 
     } 
    } 
} 

Antwort

46

Dies ist kein Fehler, es ist eine Warnung von Ihrem Microsoft-Compiler.

Wählen Sie Ihr Projekt und klicken Sie im Kontextmenü auf "Eigenschaften".

Im Dialog wählte Configuration Properties ->C/C++ ->Preprocessor

Im Bereich PreprocessorDefinitions ;_CRT_SECURE_NO_WARNINGS hinzufügen off diese Warnungen zu drehen.

+1

Ich würde diese Warnung nicht deaktivieren. Stattdessen würde ich eine sicherere Version von fopen verwenden, also fopen_s. Weitere Informationen finden Sie unter "Sicherheitsfunktionen im CRT" (http://msdn.microsoft.com/en-us/library/8ef0s5kh.aspx). – Bogdan

+5

@Bogdan Ja, das ist nett, wenn Sie nur Microsoft sind, aber das ist eine MS-Erweiterung und nicht Standard-C++. Wenn es sich um eine Bibliothek oder einen Teil eines Projekts handelt, das nicht zu 100% aus Microsoft besteht, sollten Sie die _s-Erweiterungen nicht verwenden, sondern stattdessen auf die Erstellung von ordnungsgemäßem Standardkonformcode zurückgreifen. – nvoigt

+0

können Sie immer noch fopen_s verwenden. Setze einfach den bedingten Kompilierungsblock für win32 ein. Solche Blöcke sind unvermeidbar, wenn Sie wirklich an plattformübergreifenden Projekten arbeiten. –

4

Dies ist eine Warnung für gewöhnlich. Sie können es entweder deaktivieren durch

#pragma warning(disable:4996) 

oder einfach fopen_s wie Microsoft beabsichtigt hat.

Aber achten Sie darauf, das Pragma vor anderen Überschriften zu verwenden.

+3

Das Pragma funktioniert nicht mit Visual Studio 2013. –

+1

Das ist, weil es 4996 nicht 4496 ist – eoleary

+0

Nicht mit VS2017 arbeiten – Patapoom