it-swarm.com.de

C++ veraltete Umwandlung von String-Konstante in 'char *'

Ich habe eine Klasse mit einem private char str[256];

und dafür habe ich einen expliziten Konstruktor:

explicit myClass(const char *func)
{
    strcpy(str,func);
}

Ich nenne es als:

myClass obj("example");

Beim Kompilieren bekomme ich folgende Warnung: 

veraltete Konvertierung von String-Konstante in 'Char *'

Warum passiert dies?

122
mkamthan

Diese Fehlermeldung wird angezeigt, wenn Sie eine Situation wie die folgende haben:

char* pointer_to_nonconst = "string literal";

Warum? Nun, C und C++ unterscheiden sich im Typ des String-Literal. In C ist der Typ ein Array von Char und in C++ ist es constant Array von Char. In jedem Fall dürfen Sie die Zeichen des String-Literal nicht ändern. Daher ist die const in C++ keine Einschränkung, sondern eher eine Art Sicherheitssache. Eine Konvertierung von const char* in char* ist aus Sicherheitsgründen grundsätzlich nicht ohne explizite Umwandlung möglich. Aus Gründen der Abwärtskompatibilität mit C ermöglicht die Sprache C++ jedoch weiterhin, einem char* ein Zeichenfolgenliteral zuzuweisen, und Sie werden gewarnt, dass diese Konvertierung nicht mehr verwendet wird.

Irgendwann fehlen Ihnen eine oder mehrere consts in Ihrem Programm, um die Richtigkeit von const zu gewährleisten. Der Code, den Sie uns gezeigt haben, ist jedoch nicht das Problem, da er diese Art der veralteten Konvertierung nicht durchführt. Die Warnung muss von einem anderen Ort stammen.

110
sellibitze

Die Warnung:

veraltete Konvertierung von String-Konstante in 'Char *'

ist gegeben, weil Sie irgendwo (nicht in dem von Ihnen geposteten Code) etwas tun, wie:

void foo(char* str);
foo("hello");

Das Problem ist, dass Sie versuchen, ein Zeichenfolgenliteral (mit dem Typ const char[]) in char* zu konvertieren.

Sie können einen const char[] in const char* konvertieren, da das Array in den Zeiger zerfällt. Sie machen jedoch eine veränderliche Komponente zu einer Konstanten.

Diese Konvertierung ist wahrscheinlich für die Kompatibilität mit C zulässig und gibt nur die erwähnte Warnung aus.

Als antwort nein. 2 von fnieto - Fernando Nieto beschreibt klar und richtig, dass diese Warnung ausgegeben wird, weil Sie irgendwo in Ihrem Code etwas tun (nicht in dem von Ihnen geposteten Code):

void foo(char* str);
foo("hello");

Wenn Sie jedoch auch Ihren Code warnungsfrei halten möchten, nehmen Sie einfach die entsprechende Änderung in Ihrem Code vor:

void foo(char* str);
foo((char *)"hello");

Das heißt, wandeln Sie einfach die Konstante string in (char *).

79
sactiw

Es gibt 3 Lösungen:

Lösung 1:

const char *x = "foo bar";

Lösung 2: 

char *x = (char *)"foo bar";

Lösung 3:

char* x = (char*) malloc(strlen("foo bar")+1); // +1 for the terminator
strcpy(x,"foo bar");

Arrays können auch anstelle von Zeigern verwendet werden, da ein Array bereits ein konstanter Zeiger ist.

30
anilbey

Tatsächlich ist ein String-Konstantenliteral weder ein const char * noch ein char *, sondern ein char []. Es ist ziemlich seltsam, aber in den C++ - Spezifikationen niedergeschrieben. Wenn Sie es ändern, ist das Verhalten undefiniert, da der Compiler es möglicherweise im Codesegment speichert. 

3
dan ionescu

Ich löse dieses Problem, indem Sie dieses Makro irgendwo am Anfang des Codes einfügen. Oder fügen Sie es in <iostream> hinzu, hehe.

 #define C_TEXT( text ) ((char*)std::string( text ).c_str())
1
TWOPIR

Vielleicht kannst du das versuchen:

void foo(const char* str) 
{
    // Do something
}

foo("Hello")

Für mich geht das

0
Alen Lee

Das Schlimmste daran ist die typische Mehrdeutigkeit beim Missbrauch der reservierten Word- "Zeichenfolge". Dies führt zu der falschen Annahme, dass "Beispiel" .c_str () das Problem lösen würde.

0
Jerry Miller

Ich finde diese einfache Wrapper-Klasse für das Konvertieren von C++ - Strings in char * hilfreich:

class StringWrapper {
    std::vector<char> vec;
public:
    StringWrapper(const std::string &str) : vec(str.begin(), str.end()) {
    }

    char *getChars() {
        return &vec[0];
    }
};
0
bremen_matt

Ich habe auch das gleiche Problem. Und was ich ganz einfach gemacht habe, ist das Hinzufügen von const char * anstelle von char *. Und das Problem gelöst. Wie bereits erwähnt, handelt es sich um einen kompatiblen Fehler. C behandelt Strings als Char-Arrays, während C++ sie als const-Char-Arrays behandelt.

0
dilantha111