invalid conversion from LPCSTR to char
-
Hallo,
ich versuche in einer routine welche mit Serialports arbeitet einen für CreateFileA() gültigen Port-Bezeichner zu übergeben welcher laut MS-Doku vom Typ "LPCSTR" sein muss.
Um mal ganz einfach anzufangen habe ich es so gemacht:
LPCSTR gszPort = new TCHAR(50); sprintf(gszPort, "\\\\.\\%s", "COM12");
Da meldet der Compiler (MinGW) jedoch:
error: invalid conversion from 'LPCSTR' {aka 'const char*'} to 'char*' [-fpermissive]|
-
@Knackwurst Das C in LPCSTR steht für const.
Da du den String ja beschreibst, willst das aber nicht.
Nimm LPSTR.
-
Danke, warum schreibt man nicht eigentlich gleich "const char *" oder "static const char *" ?
-
@Knackwurst sagte in invalid conversion from LPCSTR to char:
Danke, warum schreibt man nicht eigentlich gleich "const char *" oder "static const char *" ?
Weil
LPCSTR
& Co. eben die vorgegebenen Typen sind, die von der API erwartet werden,const char*
& Co. aber eben nicht. Die mögen zwar in 99.9% aller Fälle synonym füreinander sein, müssen sie aber nicht. Einconst char*
darf theoretisch auch was anderes sein als einLPCSTR
sein und in solchen Fällen mussLPCSTR
entsprechend eine andere Definition haben, sonst geht die Kommunikation mit der API schief.Bei
LPCSTR
ist es noch einigermaßen unrealistisch, dass es jemals einen Fall gibt, wo derchar
nicht kompatibel zu den Erwartungen der Windows-API ist, weil es Windows meines Wissens nach nur für Systeme mit 8-Bit Bytes gibt (Es gibt aber an sich Systeme auf der Welt mit breiteren Bytes und für die gibt es auch C++!), aber wenn man zu breiteren Zeichenencodings geht, wie z.B.LPTCSTR
oderLPTWSTR
ist es schon realistischer, dass sich da die Erwartungen der Winapi nicht unbedingt mit der Compilerdefinition eineswchar_t
decken müssen.Und Wenn ich schon
LPTCSTR
erwähne:TCHAR
ist ja sogar explizit jeweils was anderes, je nachdem, ob man nun für Unicode oder für ANSI Codierung übersetzt.
-
@DirkB sagte in invalid conversion from LPCSTR to char:
@Knackwurst Das C in LPCSTR steht für const.
Ganz wichtig auch zu wissen, dass es sich um einen Long Pointer handelt, sonst könnte man meinen, der dürfe nur auf das aktuelle 16-Bit Datensegment zeigen.... sorry, konnt ich mir nicht verkneifen
-
Vielen Dank, wieder was gelernt!!!
-
@Finnegan Man soll ja an die Zukunft denken. Vielleicht hat ja irgendwann mal jemand mehr Speicher als die 640k
-
Es ist aber ein weiteres gutes Beispiel für den Sinn der Typedefs. Als diese Spezifikationen Anno 198x geschrieben wurden, war das aus dem gesagten Grund meist kein
typedef LPCSTR const char *
, sondern halttypedef LPCSTR const char * far
. Und obwohl das heute meistens anders sein dürfte, kann Code von damals, derLPCSTR
benutzt, theoretisch heute noch übersetzt werden (abgesehen von 100 anderen Sachen, die sich an den Feinheiten der Sprache geändert haben).