[gelöst]deprecated conversion from string constant to ‘char*

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ML1982
Beiträge: 32
Registriert: 19.09.2007 22:09:11

[gelöst]deprecated conversion from string constant to ‘char*

Beitrag von ML1982 » 05.10.2007 01:17:56

Seitdem ich gcc 4.2 benutze erhalte ich sehr oft die Warning

deprecated conversion from string constant to ‘char*

dies scheint dann zu passieren, wenn aus c++ code heraus eine c funktion mit einem Konstanten String aufgerufen wird.

Beispiel:
c++ file:

Code: Alles auswählen

Msg_Print("Calib", ML_1, "\nList of Calibrationpoints in ground plane\n");
c header-file das die Deklaration der Funktion enthält:

Code: Alles auswählen

extern "C" {
 extern void Msg_Print(char *ident, uint8 level, char *fmt,...);
}
mit cast auf (char*) verschwindet die Warning zwar aber ist das wirklich die Lösung? Was ist daran deprecated?!?
Wie unterdrücke ich die Warning, ich müsste nämlich mehrere 100 Zeilen code anpassen:-(

so verschwindet die Warning

Code: Alles auswählen

Msg_Print((char*)"Calib", ML_1,(char*)" \nList of Calibrationpoints in ground plane\n");
habe bei google zwar andere Leute mit dem Problem, aber keine Lösung gefunden.
http://gcc.gnu.org/ml/gcc-help/2006-07/msg00055.html

ich habe auch schon in der Offiziellen GNU Doku rumgesucht aber der richitge Stelle nicht gefunden... und naja die Seite für Seite zu lesen würde etwas lange dauern...http://gcc.gnu.org/onlinedocs/
Zuletzt geändert von ML1982 am 07.10.2007 12:54:33, insgesamt 1-mal geändert.

Benutzeravatar
uljanow
Beiträge: 529
Registriert: 20.09.2005 21:14:00

Beitrag von uljanow » 05.10.2007 03:11:05

Ein impliziter cast von const char* (der Typ eines String literals) nach char* ist bedenklich. Das extern "C" beschreibt nur den Linkage, d.h. die Funktion gehorcht immer noch dem C++ Typsystem.
Die sauberste Lösung wäre die Signatur der Funktion in const char* zu ändern, da ja anscheinend der String nicht verändert wird.

ML1982
Beiträge: 32
Registriert: 19.09.2007 22:09:11

Beitrag von ML1982 » 06.10.2007 00:16:33

Wenn ich das jetzt richtig verstanden habe, werden also string-literale in C und C++ unterschiedlich behandelt.

Die Lösung mit der Signatur gefällt mir auch am besten!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 06.10.2007 00:32:29

ML1982 hat geschrieben:Wenn ich das jetzt richtig verstanden habe, werden also string-literale in C und C++ unterschiedlich behandelt.
ja, siehe:

Code: Alles auswählen

root@gms4:~# cat x.c
int f (char* x) { }
int main() { f((const char*)"blabla");}
root@gms4:~# gcc -o x x.c
x.c: In function 'main':
x.c:2: warning: passing argument 1 of 'f' discards qualifiers from pointer target type
root@gms4:~# vi x.c
root@gms4:~# cat x.c
int f (char* x) { }
int main() { f("blabla");}
root@gms4:~# gcc -o x x.c
root@gms4:~#
root@gms4:~# mv x.c x.cpp
root@gms4:~# g++ -o x x.cpp
x.cpp: In function 'int main()':
x.cpp:2: warning: deprecated conversion from string constant to 'char*'
ML1982 hat geschrieben: Die Lösung mit der Signatur gefällt mir auch am besten!
mir auch

Gruß
gms

ML1982
Beiträge: 32
Registriert: 19.09.2007 22:09:11

Beitrag von ML1982 » 07.10.2007 12:52:06

eine gute Übersicht über die Varianten

const char* prt
char const* ptr
char* const ptr
usw...

gibt es übrigens hier(ganz unten):
http://tutorial.schornboeck.net/zeiger.htm

Antworten