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

-1voto

Verwenden Sie die -Wno-deprecated Option, um veraltete Warnmeldungen zu ignorieren.

-1voto

shindow Punkte 9

Sieh dir diese Situation an:

typedef struct tagPyTypeObject
{
    PyObject_HEAD;
    char *name;
    PrintFun print;
    AddFun add;
    HashFun hash;
} PyTypeObject;

PyTypeObject PyDict_Type=
{
    PyObject_HEAD_INIT(&PyType_Type),
    "dict",
    dict_print,
    0,
    0
};

Beobachte das name Feld. Verwenden von gcc, es kompiliert ohne Warnung, aber in g++ wird es. Ich weiß nicht warum.

-2voto

msn Punkte 140

Zu shindow's "answer":

PyTypeObject PyDict_Type=
{
    ...

PyTypeObject PyDict_Type=
{
   PyObject_HEAD_INIT(&PyType_Type),
                      "dict",
                      dict_print,
                      0,
                      0
};

Achte auf das name Feld. Mit gcc wird es ohne Warnung kompiliert, aber mit g++ wird es nicht. Ich weiß nicht warum.

In gcc (Kompilieren von C) ist -Wno-write-strings standardmäßig aktiviert.

In g++ (Kompilieren von C++) ist -Wwrite-strings standardmäßig aktiviert.

Deshalb gibt es ein unterschiedliches Verhalten.

Bei der Verwendung von Makros von Boost_python erzeugt solche Warnungen. Deshalb verwenden wir -Wno-write-strings beim Kompilieren von C++ da wir immer -Werror verwenden.

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