[g++] warning: deprecated conversion from string constant to ‘char*’ bei putenv("foo")
-
Hallo zusammen,
ich weiß, wie ich die Warnung bei selbst geschriebenen Funktionen lösen kann (char * -> const char *). Aber geht das auch irgendwie ohne -Wno-write-strings zum compiler hinzu zu fügen?
Bei mir kommt die Warnung, wie im Titel beschrieben, beim Aufruf von:
putenv("foo");Besten Dank,
JRS
-
Die Lösung bei Warnungen ist in der Regel, es richtig zu machen, nicht die Warnung abzuschalten
. So auch hier.Wenn deine Funktion die Zeichenkette verändert, wird sie, wie der Compiler richtig erkennt, explodieren. Wenn sie die Zeichenkette nicht verändert, dann ist dein Code falsch, da er nicht const correct ist (die Funktion sollte dann ein
const char*als Parameter nehmen).P.S.: std::string, schon mal gehört?
-
SeppJ schrieb:
Wenn deine Funktion die Zeichenkette verändert
man: putenv ist aber nicht seine Funktion.
Das Problem könnte hierin liegen:
In either case, the string pointed to by string shall become part of the environment, so altering the string shall change the environment. The space used by string is no longer used once a new string which defines name is passed to putenv().
Ich versteh es nicht so ganz, aber irgendwie scheint es, als wäre es mit Absicht nicht const.
-
Verwende setenv
-
Hey,
vielen Dank! Ich bin nun auf setenv umgestiegen. Nun ist der Fehler weg. Warum putenv allerdings nicht char const * verwendet ist mir nicht ganz klar...
Beste Grüße
-
JRS schrieb:
Hey,
vielen Dank! Ich bin nun auf setenv umgestiegen. Nun ist der Fehler weg. Warum putenv allerdings nicht char const * verwendet ist mir nicht ganz klar...
Beste Grüße
Warum was verstehst du nicht? Haste dir den Link zur manpage von putenv druchgelesen?
Da steht doch das dein char* Teil der Umgebung wird und fallst du diesen aenderst das auch in der Umgebung geaendert wird.
z.B.
/*includes .... */ int main(int argc, char** argv) { char* env = new char[100]; static char* default_value = "home=\user\home"; strcpy(env, default_value); putenv(env); // nun hat die env variable home den wert "\user\home" std::cout << "set new value for env var home: "; std::cin.getline(&env[5], 95); std::cout << "new value for home: " << getenv("home") << "\n"; putenv(default_value); // weiss nicht ob man das braucht ob die variable beim verlassen des Programms nochmal bentutz wird aber sicher ist sicher delete[] env; return 0; }Ich hoff dir wird jetzt klar warum. Es ist einfach so vorgesehen das man den String aendern kann und damit auch die Umgebung aendert.
Gruessle
-
Hey,
ja jetzt ist es mir klar. Vielen Dank nochmal für die Erklärung.
Es macht also auch keinen großen Sinn putenv ein festes Literal zu übergeben.Beste Grüße
-
Die Erklärung ist nicht überzeugend.
Das Argument müsste nur nicht-const sein, wenn putenv selbst den String verändern wollte. Was es nicht tut. Änderungen von außen sind auch bei const-Argument möglich.
-
Möglicherweise einfach alter C-Code?
-
Manpage schrieb:
The type of the argument to this function is changed from const char * to char *. This was indicated as a FUTURE DIRECTION in previous issues.