429 Stimmen

Wie man die Warnungen `deprecated conversion from string constant to 'char*'` in GCC los wird.

Ich arbeite an einem äußerst großen Codebasis und habe kürzlich auf GCC 4.3 aktualisiert, was jetzt diese Warnung auslöst:

Warnung: veraltete Konvertierung von String-Konstante zu 'char*'

Offensichtlich ist der richtige Weg, um dies zu beheben, jede Deklaration wie

char *s = "Konstante Zeichenfolge";

oder Funktionsaufruf wie:

void foo(char *s);
foo("Konstante Zeichenfolge");

und sie zu const char Zeigern zu ändern. Allerdings würde das bedeuten, dass ich mindestens 564 Dateien berühren müsste, was keine Aufgabe ist, die ich zu diesem Zeitpunkt ausführen möchte. Das Problem im Moment ist, dass ich mit -Werror ausgeführt werde, also brauche ich eine Möglichkeit, um diese Warnungen zu unterdrücken. Wie kann ich das machen?

2 Stimmen

Wenn Sie sich daran machen, 554 Zeilen zu ersetzen, ist sed ein guter Freund. Stellen Sie jedoch sicher, dass Sie zuerst ein Backup erstellen.

2 Stimmen

Ich habe mir die Diskussionen darüber angesehen, wie man die Fehlermeldungen unterdrücken kann und was die korrekten Ersatzwerte sein sollten. Ich habe keine Meinung dazu. Ich denke jedoch, dass Matt auf dem richtigen Weg ist. Definieren Sie, was Sie durch was ersetzen möchten. Sie benötigen nur die richtigen regulären Ausdrücke. Machen Sie die Änderungen in einer Kopie. Verwenden Sie "diff", um sie mit dem Original zu vergleichen. Das Ändern mit sed ist schnell, einfach und kostenlos, diff ist ebenfalls schnell, einfach und kostenlos. Probieren Sie es aus und sehen Sie, wie viele Änderungen Sie überprüfen müssen. Geben Sie an, was Sie durch was ersetzen möchten, und lassen Sie die Benutzer Regex-Ersatzwerte vorschlagen.

0 Stimmen

Die gesamte Diskussion verfehlt den Punkt, warum dieses Problem überhaupt gelöst werden muss, laut der gcc-Warnung. Der Grund steht in David Schwartz' Antwort stackoverflow.com/questions/56522654/….

28voto

EdH Punkte 3114

Hier ist, wie man es inline in einer Datei macht, sodass man das Makefile nicht ändern muss.

// Beseitigt lästige "deprecated conversion from string constant blah blah" Warnung
#pragma GCC diagnostic ignored "-Wwrite-strings"

Du kannst dann später...

#pragma GCC diagnostic pop

26voto

takataka Punkte 275

Ersetzen

char *str = "hello";

durch

char *str = (char*)"hello";

oder wenn Sie es in einer Funktion aufrufen:

foo("hello");

ersetzen Sie dies durch

foo((char*) "hello");

25voto

vy32 Punkte 26016

Ich kann den Compiler-Schalter nicht benutzen. Also habe ich das hier umgewandelt:

char *setf = tigetstr("setf");

zu diesem:

char *setf = tigetstr((char *)"setf");

15voto

John Punkte 151

Statt:

void foo(char *s);
foo("Konstante Zeichenkette");

Das funktioniert:

void foo(const char s[]);
foo("Konstante Zeichenkette");

15voto

appapurapu Punkte 572

In C++ verwenden Sie const_cast wie folgt

char* str = const_cast("Test string");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X