warning C4995



  • Hallo

    Wenn ich meinen Code, der in Visual Studio 2008 geschrieben wurde, in Visual Studio 2010 kompiliere erhalte ich folgende Warnungen:

    c:\programme\microsoft visual studio 10.0\vc\include\string(757): warning C4995: 'swprintf': der Name, der als #pragma markiert war, wurde verworfen
    c:\programme\microsoft visual studio 10.0\vc\include\string(766): warning C4995: 'swprintf': der Name, der als #pragma markiert war, wurde verworfen
    c:\programme\microsoft visual studio 10.0\vc\include\string(775): warning C4995: 'swprintf': der Name, der als #pragma markiert war, wurde verworfen
    

    Was muss ich da machen. Das its ja kein code von mir?



  • Installier die englische Version, dann bekommst du auch lesbare Fehlermeldungen.

    C4995 schrieb:

    'function': name was marked as #pragma deprecated

    The compiler encountered a function that was marked with pragma deprecated. The function may no longer be supported in a future release. You can turn this warning off with the warning pragma (example below).

    Wenn du die Warning "beheben" willst, verwende eine andere Funktion.
    Wenn du die Warning unterdrücken willst, probier mal folgendes in dein stdafx.h File zu schreiben:

    #define _CRT_SECURE_NO_WARNINGS
    #define _SCL_SECURE_NO_WARNINGS
    


  • Was meinst du mit

    "Wenn du die Warning "beheben" willst, verwende eine andere Funktion."

    Das ist doch ein Fehler bzw Warnung im Standard. Soll ich nun kein String mehr verwenden oder wie?



  • Was soll ich damit meinen, das was dasteht natürlich.

    Gibt ja noch andere sprintf Variationen.

    Und was du mit

    Das ist doch ein Fehler bzw Warnung im Standard.

    meinst entzieht sich mir vollkommen.
    Grammatikalisch korrekt, aber semantisch erschliesst sich mir der Satz gar nicht.

    Das ist ne Warning und kein Fehler, und was das alles mit dem Standard zu tun hat weiss ich gleich gar nicht.



  • Ganz einfach ich verwende die Funktion "swprintf" nicht.

    Die Funktion wird im string standard header verwendet. Habe ja extra den Pfad aufgeführt:

    c:\programme\microsoft visual studio 10.0\vc\include\string(757)



  • Hihi. OK. Sorry.

    Welche Version von VS 2010 verwendest Du (vielleicht immer noch das CTP oder ne Beta)?
    Und kannst du ein kleines Testprogramm machen mit dem sich das rekonstruieren lässt?

    Die beiden #defines kannst du übrigens trotzdem mal probieren, kann sein dass damit die Warning dann weg ist.



  • Verwende die Version: 10.0.30319.1 RTMRel. Die neuste würde ich sagen?

    Und kannst du ein kleines Testprogramm machen mit dem sich das rekonstruieren lässt?

    Hm mal schauen. Weiß gar nicht was ich da wo verwende dass der Fehler auftritt. Der Kompiler sagt mir ja nicht wo.

    Die defines hatte ich vorher schon drin. Das hilft nichts



  • Ja, das müsste die neueste sein.

    Guck mal nach welche Funktionen das sind (einfach auf die Fehlermeldung doppelklicken müsste reichen). Wenn es irgendwelche "_Blah" Funktionen sind (private Helperfunktionen), sieh einfach nach welche öffentlichen Funktionen diese aufrufen.

    Und dann bastel ein Programm das einfach nur diese Funktionen aufruft - sollte eigentlich reichen um die Warning zu provozieren.

    Ich hab' VS 2010 auf dem Rechner wo ich gerade bin nicht installiert, aber wenn ich zu Hause nochmal dran denke probier ich es auch selbst aus.

    Falls die Warning nicht durch irgendwas "unorthodoxes" in deinem Programm getriggert wird ist das wohl ein Kandidat für nen Bug-Report 🙂



  • Hallo nochmal

    Also die funktion lautet wie folgt:

    inline wstring to_wstring(long double val)
    

    (eine von 3 Überladungen)

    Aber auch wenn ich die direkt in einem Testprogramm aufrufe kommt der Fehler nicht. Versteh es nicht.



  • so nun habe ich die Stelle gefunden, die mir die Warnung verursacht und auch ein kleines Testprogramm geschrieben:

    Habe ein MFC Projekt angelegt und folgenden Code implementiert:

    #include "strsafe.h"
    #include <string>
    
    void irgendeineFunktion()
    {
        CString bla = "Hallo";
        char var1[255];
        StringCbCopy(var1,sizeof(var1), bla);
    }
    

    so das gibt nun die Warnung. Hier in dem Fall sogar noch andere die aber alle in die gleiche Richtung gehen.



  • OK.
    Es reicht wenn du die beiden Files in der Reihenfolge inkludierst wie in deinem Beispiel, die Funktion mit StringCbCopy ist gar nicht nötig:

    #include <strsafe.h>
    #include <string>
    

    -> Warnings

    Was du machen kannst ist die Reihenfolge der includes umdrehen:

    #include <string>
    #include <strsafe.h>
    

    -> keine Warnings

    Ist mMn. ein Defekt in der Standard-Library von MS -> sollte man vermutlich reporten. In deinem Programm reicht es aber vermutlich erstmal wenn du <string> als eines der ersten Files in stdafx.h inkludierst.

    Aaaah. Vielleicht meint MS auch dass es "OK" ist alle Warnings für "unsichere" Funktionen wieder zu aktivieren, wenn man <strsafe.h> inkludiert hat. Weil man natürlich, sobald man eine Funktion aus <strsafe.h> verwendet auch alle anderen 10000 Stellen anpassen möchte wo man noch "unsafe" Funktionen verwendet. Oder so. Keine Ahnung.

    EDIT: ich hab' das gerade reported, also bitte nicht nochmal reporten 🙂



  • Hallo

    Was du machen kannst ist die Reihenfolge der includes umdrehen:

    Ja kann ich in meinem Testprogramm machen. In meiner richtigen Applikation habe ich nur <strsafe.h> inkludiert. An dieser stelle inkludiere ich nichts weiter.



  • Ok. Muss halt einfach sicherstellen dass strsafe.h als letztes includiert wird. Auch über mehrere Dateien hinweg. Klar 👍

    Also danke für deine Hilfe und dein Bugreport.


Log in to reply