deprecated conversion from string constant to char *



  • Ich habe hier folgenden Code:

    char * foo = "A";
    if(condition)
    {
      foo = "B";
    }
    

    Es kompiliert unter linux und windows, aber gcc wirft mir die obige warnung.
    In dieser Situation ist es nicht angebracht foo als const char * zu deklarieren, weil er ja zu einem späteren Zeitpunkt geändert wird.
    Was ist in solchen fällen die gängige Methode ohne auf std::string zu wechseln?



  • Die richtige Lösung wäre dein Desgin zu ändern und auf std::string umzusteigen.

    Eine einfache (und unsichere) Lösung wäre strcpy zu verwenden.



  • const char* besagt nur, dass der Inhalt nicht veraendert werden darf. Das, was du dort als Code zeigst, aendert den Inhalt nicht, sondern nur worauf const char* zeigt. "A" als auch "B" sind selbst const char*. Also sollte foo auch von const char* sein. Ein foo[0] = 'C' ist sowieso verboten (ob 's verboten ist, weiss ich nicht genau, jedoch wuerde ich es nicht erlauben), so aendert man den Inhalt auf den foo zeigt.

    Ich wuerde const char* benutzen, sofern der String unveraendert bleibt. std::string fuer alles andere. Neben strcpy existiert auch noch strncpy das einige Nachteile von strcpy umgeht.



  • Seikilos schrieb:

    ...
    In dieser Situation ist es nicht angebracht foo als const char * zu deklarieren, weil er ja zu einem späteren Zeitpunkt geändert wird....

    😮 Davon würde ich intensiv abraten!!!
    Der Versuch, einen Literal zu ändern, resultiert oft in garstigen Fehlern!

    Wenn Du also zu faul ( 😉 ) bist, um auf std::string zu wechseln, spricht nichts gegen:

    char const * foo = "A";
    if(condition)
    {
      foo = "B";
    }
    

    oder gleich:

    char foo = 'A';
    if(condition)
    {
      foo = 'B';
    }
    

    😉

    Was nicht geht (und Du evtl. damit verwechselt hast), ist:

    char * const foo = "A";
    if(condition)
    {
      foo = "B"; // FEHLER!! 
    }
    

    Gruß,

    Simon2.



  • Seikilos schrieb:

    In dieser Situation ist es nicht angebracht foo als const char * zu deklarieren, weil er ja zu einem späteren Zeitpunkt geändert wird.

    Falsch. Du änderst den Pointer, nicht den Inhalt. Der Inhalt bleibt jeweils konstant, also ist const char* völlig richtig.



  • Danke für die Erklärung Leute.

    Ich hab in der Tat const char * mit char * const verwechselt.


Anmelden zum Antworten