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/….

0voto

Anjan Parajuli Punkte 1

Beim Übergeben von String-Konstanten an Funktionen sollte es so geschrieben werden:

void setpart(const char name[]);

setpart("Hallo");

Statt const char name[] könnten Sie auch const char \*name schreiben.

Es hat bei mir funktioniert, um diesen Fehler zu beheben:

[Warnung] veraltete Konvertierung von einer String-Konstanten zu 'char*' [-Wwrite-strings]

0voto

BillAtHRST Punkte 35

Sie können auch einen beschreibbaren String aus einer Zeichenkonstante erstellen, indem Sie strdup() aufrufen.

Zum Beispiel erzeugt dieser Code eine Warnung:

putenv("DEBUG=1");

Der folgende Code jedoch nicht (er macht eine Kopie des Strings im Heap, bevor er ihn an putenv übergibt):

putenv(strdup("DEBUG=1"));

In diesem Fall (und vielleicht in den meisten anderen Fällen) ist es keine gute Idee, die Warnung zu deaktivieren - sie ist aus einem bestimmten Grund vorhanden. Die andere Alternative (alle Strings standardmäßig beschreibbar zu machen) ist potenziell ineffizient.

Hören Sie auf das, was der Compiler Ihnen sagt!

0voto

Micheal Morrow Punkte 95

Aus verschiedenen Teilen wird diese Lösung zusammengestellt. Dies lässt sich sauber kompilieren.

const char * timeServer[] = { "pool.ntp.org" }; // 0 - Weltweit
#define WHICH_NTP            0 // Welchen NTP-Servernamen verwenden.
...
sendNTPpacket(const_cast(timeServer[WHICH_NTP])); // Senden eines NTP-Pakets an einen Server
...
void sendNTPpacket(char* address) { code }

Ich weiß, dass nur ein Element im timeServer-Array vorhanden ist. Es könnten jedoch mehr sein. Die anderen sind vorerst auskommentiert, um Speicher zu sparen.

0voto

Verwenden Sie einfach die -w Option für g++.

Beispiel:

g++ -w -o simple.o simple.cpp -lpthread

Denken Sie daran, dass dies nicht die Verwendung veralteter Elemente vermeidet. Es unterdrückt lediglich die Anzeige von Warnmeldungen im Terminal.

Wenn Sie wirklich veraltete Elemente vermeiden möchten, verwenden Sie das const Schlüsselwort wie folgt:

const char* s = "konstanter String";

-1voto

James Antill Punkte 2767

Das Problem im Moment ist, dass ich mit -Werror laufe

Das ist dein wahres Problem, meiner Meinung nach. Du kannst einige automatisierte Methoden ausprobieren, um von (char *) zu (const char *) zu wechseln, aber ich würde wetten, dass sie nicht einfach funktionieren. Du wirst wahrscheinlich mindestens einen Menschen für einen Teil der Arbeit benötigen. Für die Kurzfristig ignoriere einfach die Warnung (aber meiner Meinung nach lass sie an, sonst wird sie nie behoben) und entferne einfach das -Werror.

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