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

583voto

John Punkte 7154

Alle Funktionen, in die Sie Zeichenfolgenliterale "Ich bin ein Zeichenfolgenliteral" übergeben, sollten char const * anstelle von char* als Typ verwenden.

Wenn Sie etwas reparieren, machen Sie es richtig.

Erklärung:

Sie können Zeichenfolgenliterale nicht verwenden, um Zeichenfolgen zu initialisieren, die geändert werden sollen, da sie vom Typ const char* sind. Die Konstanz zu späteren Modifikationen zu entfernen ist undefiniertes Verhalten, daher müssen Sie Ihre const char* Zeichenfolgen Zeichen für Zeichen in dynamisch allokierte char* Zeichenfolgen kopieren, um sie zu ändern.

Beispiel:

#include 

void print(char* ch);

void print(const char* ch) {
    std::cout<

241voto

DGentry Punkte 15830

Ich glaube, dass die Angabe von -Wno-write-strings an GCC diese Warnung unterdrücken wird.

75voto

BlackShift Punkte 2134

Ich hatte ein ähnliches Problem und habe es so gelöst:

#include <string.h>

extern void foo(char* m);

int main() {
    // warning: deprecated conversion from string constant to ‘char*’
    //foo("Hello");

    // no more warning
    char msg[] = "Hello";
    foo(msg);
}

Ich hatte keinen Zugriff auf foo, um es anzupassen, damit es const char* akzeptiert, was eine bessere Lösung wäre, weil foo sich nicht geändert hat.

67voto

Rob Walker Punkte 45267

Schauen Sie sich den Diagnostik-Pragma-Support von GCC an und die Liste der -W Warnungsoptionen.

Für GCC können Sie #pragma warning-Direktiven verwenden, wie hier erklärt.

34voto

Konrad Rudolph Punkte 503837

Wenn es sich um eine aktive Codebasis handelt, möchten Sie möglicherweise trotzdem die Codebasis aktualisieren. Natürlich ist es nicht praktikabel, die Änderungen manuell vorzunehmen, aber ich glaube, dass dieses Problem einmalig durch einen einzigen sed-Befehl gelöst werden könnte. Ich habe es jedoch nicht ausprobiert, also nehmen Sie das Folgende mit einer Prise Salz.

find . -exec sed -E -i .backup -n \
    -e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;

Dies könnte nicht alle Stellen finden (nicht einmal Funktionaufrufe berücksichtigt), aber es würde das Problem lindern und es möglich machen, die wenigen verbleibenden Änderungen manuell durchzuführen.

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