Compilerwarnungen in VC++



  • hallo zusammen,

    im Zuge folgender Codezeile

    putenv(const_cast<char*>("SDL_VIDEO_CENTERED=1")) ;
    

    ,

    die in einem Fremdprojekt gesehen habe und deren Sinn ich natürlich sofort hinterfragt habe, bin ich zu dem Schluss gekommen, dass es ohne den cast und somit mit implizierter Konvertierung zu einer Warnung kommen müsste, die bei meinem Compiler wohl standardmäßig deaktiviert ist. Kann mir mal jemand auf die Schnelle sagen, wo ich das einstellen kann, weil die Compileroptionen erinnern mich eher an ein Cockpit einer 747.

    Ist der string da jetzt eigentlich ein const char oder ein const char*?

    Vielen Dank im Voraus



  • banshee schrieb:

    die Compileroptionen erinnern mich eher an ein Cockpit einer 747.

    😃 👍

    Wenn mich nicht alles täuscht, sind Stringliterale in C vom Typ char*. Ob das in C++ geändert wurde, weiß ich nicht, aber offenbar scheint das nicht passiert zu sein, es sei denn, der MSVC macht hier nur ein Zugeständnis an die unüberschaubare Zahl alter Projekte, die sich darauf verlassen. Allerdings würde dann wahrscheinlich, analog zur alten Scope-Regelung bei for-Schleifen und zu typedef unsigned short wchar_t, eine Projektoption zur Konfiguration existieren, die ich aber bisher nicht fand.



  • Der Code wäre ohne den const_cast sowohl in C als auch in C++ korrekt.
    Die Signatur der Funktion putenv lautet in C++: putenv(const char *).
    Und da String-Literale in C++ per Definition konstant sind (const char *), benötigt man kein const_cast.
    Er schadet in diesem Fall aber auch nicht, da dann eine implizite Rück-Konvertierung von "char *" nach "const char *" gemacht wird (ist aber eigentlich völlig überflüssig!!!).

    Nur wenn die Funktion einen "char *" erwartet, und man einen "const char *" (z.B. ein String-Literal) übergibt, so benötigt man einen cast (jedoch sollte man sich ABSOLUT sicher sein, daß die Funktion dann nur lesend darauf zugreift, weil es sonst zu einem Laufzeitfehler kommen kann - falls z.B. Literale in einem schreibgeschützten Bereich abgelegt werden).

    Welche MSVC Version hast du denn?
    Ältere Versionen haben die implizite Konvertierung von "const char *" nach "char *" erlaubt (auch wenn es eigentlich nicht dem Standard entspricht), um z.B. viele WIN-API Funktionen noch fehlerfrei aufrufen zu können...

    Aber ob es dafür eine extra Compileroption gibt, weiß ich nicht (evtl. mal die Microsoft Compiler Language Extensions auschalten (/Za), aber dann kompilieren auch viele Programme nicht mehr...)



  • Th69 schrieb:

    Er schadet in diesem Fall aber auch nicht, da dann eine implizite Rück-Konvertierung von "char *" nach "const char *" gemacht wird (ist aber eigentlich völlig überflüssig!!!).

    Also von dem String wird erst das const entfernt und dann implizit durch das Funktionsargument wieder nach const char* gecastet?

    Th69 schrieb:

    Welche MSVC Version hast du denn?

    VC++ Express 2005.
    Ich muss gestehen, dass ich mich mit den ganzen Möglichkeiten, die mir so eine IDE bietet so gut wie gar nicht auskenne, weil ich es bisher auch noch nicht gebraucht hab.



  • Th69 schrieb:

    Welche MSVC Version hast du denn?
    Ältere Versionen haben die implizite Konvertierung von "const char *" nach "char *" erlaubt

    Auch VC++ 2008 faßt Stringliterale offenbar noch als "char*" auf, ganz unabhängig von der "Microsoft Extensions"-Option.



  • Th69 schrieb:

    Ältere Versionen haben die implizite Konvertierung von "const char *" nach "char *" erlaubt (auch wenn es eigentlich nicht dem Standard entspricht)

    Es gibt keine implizite Konvertierung von const char* nach char* wohl aber eine von const char[..] nach char* sofern der zu konvertierende Ausdruck ein (Narrow-)Stringliteral ist. Diese Konvertierung ist vom Standard vorgegeben, allerdings deprecated - deshalb erhält man üblicherweise eine Warnung.
    Der Typ eines (Narrow-)Stringliteral ist (und wahr schon immer, seit es const gibt) ein Array aus const char.


Log in to reply