Warning: deprecated conversion from string constant to 'char*'

Ich stolpere gerade über diese Warnung:

warning: deprecated conversion from string constant to 'char*'
constexpr char* TOPIC_POWER = "Nici/Schrank/Power";

void setup() {
  Serial.begin(115200);
  Serial.println(TOPIC_POWER);
}

void loop() {}

Warum ist es ein Problem? Wie wäre es korrekt? Es soll eine konstante Zeichenkette in einem CharArray gehalten werden.

Folgende zwei Lösungen habe ich gefunden:

constexpr char TOPIC_POWER[] = "Nici/Schrank/Power";

void setup() {
  Serial.begin(115200);
  Serial.println(TOPIC_POWER);
}

void loop() {}
constexpr char* TOPIC_POWER = (char*)"Nici/Schrank/Power";

void setup() {
  Serial.begin(115200);
  Serial.println(TOPIC_POWER);
}

void loop() {}

Aber warum ist es "deprecated"? Warum war es früher Möglich und aktuell gibt es eine Warnung?

Die Antwort ist leicht!
Weil es vom Standard verboten (worden) ist.
Den können wir nicht wirklich ändern, also sollte man ihn akzeptieren.

E:\Programme\arduino\portable\sketchbook\sketch_oct31d\sketch_oct31d.ino:3:31: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    3 | constexpr char* TOPIC_POWER = "Nici/Schrank/Power";
      |                               ^~~~~~~~~~~~~~~~~~~~

Du suchst evtl:

const char * const TOPIC_POWER = "Nici/Schrank/Power";

Ein read only Zeiger auf eine read only Zeichenkette.

Ansonsten wirfst du da ein paar Begriffe durcheinander, so dass ich da wenig zu sagen kann.
Klarer: Ich verstehe nicht, was du (und auch warum) erreichen willst.

Ich bastel gerade etwas mit einen ESP8266 und MQTT.

Die Topics für MQTT hinterlegt man in CharArrays (oder heißt das anders?). Diese ändern sich auch während der Laufzeit nicht mehr.

Ich hatte dies aus einen älteren Sketch aufgenommen. Das Warning kam beim kompilieren. Ich ging auf die Suche nach Lösungen.

Dann interessierte mich, warum dies nicht mehr zum „Standart“ gehört.

Man möge mich korrigieren, wenn ich da falsch liege aber:

constexpr char* ist im Grunde dasselbe wie "char * const" was ein konstanter Zeiger auf ein nicht-konstantes char Array ist. Das ist aber nicht korrekt, weil String-Literale den Typ const char Variable[n] haben, also der "Inhalt" konstant ist.

"constexpr const char*" auf der anderen Seite, ist im Grunde dasselbe wie "const char* const" was ein konstanter Zeiger auf ein konstantes char Array ist. Hier ist sowohl der Zeiger, als auch der "Inhalt" auf den der Zeiger zeigt, konstant

also

const char* TOPIC_POWER = "Nici/Schrank/Power"; // Konstanter "Inhalt", nicht konstanter Zeiger
oder
constexpr const char* TOPIC_POWER = "Nici/Schrank/Power"; // "Inhalt" wie auch Zeiger konstant

passt.

1 Like

... wäre auch const char * const TOPIC_POWER = "Nici/Schrank/Power";
(hat @combie schon vorgeschlagen)

Welches const jetzt was konstant macht und warum für constexpr da eine andere Syntax gilt als für const ist wirklich etwas verwirrend und hängt wohl damit zusammen dass etwas das mal definiert wurde, nie mehr geändert werden darf.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.