reinterpret_cast vs. C Casts
-
Moinsen
Heute habe ich etwas "interessantes" gesehen. Irgendwie Funktioniert
der reinterpret_cast bei VC++-9 nicht richtig?Ich habe Folgende Funktion, welche mir aus dem struct den String
Extrahiert. Es ist so eine MS Struktur: http://msdn.microsoft.com/en-us/library/ms735602(VS.85).aspxstd::string CUtils::extractString(char* strPoint, DWORD &size) { char* tmpString = reinterpret_cast<char*>(malloc(size +1)); memset(tmpString, 0, size +1); memcpy(tmpString, strPoint, size); tmpString[size] = '\0'; std::string retStr(tmpString); free(tmpString); return retStr; }Beim Aufruf kommt aber nun das Komische:
Funktioniert nicht (C++):
m_devList.at(i) = CUtils::extractString( reinterpret_cast<char*>(devCap + devCap->dwLineNameOffset), devCap->dwLineNameSize);Funktioniert (C):
m_devList.at(i) = CUtils::extractString( (char*)devCap + devCap->dwLineNameOffset, devCap->dwLineNameSize);reinterpret_cast<char*> sollte doch das gleiche machen wie (char*)?!
Hab ich da was falsches im Kopf?Gruss
Ghost
-
Beim C-Cast besteht z.B. die Gefahr, dass du aus versehen die constness wegcastest.
-
xGhost schrieb:
reinterpret_cast<char*> sollte doch das gleiche machen wie (char*)?!
Hab ich da was falsches im Kopf?Achte auf die Klammersetzung. Die beiden Codefragmente sind unabhängig vom cast nicht identisch.
-
() schrieb:
xGhost schrieb:
reinterpret_cast<char*> sollte doch das gleiche machen wie (char*)?!
Hab ich da was falsches im Kopf?Achte auf die Klammersetzung. Die beiden Codefragmente sind unabhängig vom cast nicht identisch.
Wie meinst du das?
-
xGhost schrieb:
Wie meinst du das?
Operatoren haben eine gewisse Rangfolge. Die Typumwandlung steht dabei vor der Addition.
Hier wird zuerst addiert und anschließend gecastet
reinterpret_cast<char*>(devCap + devCap->dwLineNameOffset)Hier wird der 1. Operand der Addition gecastet bevor die Addition durchgeführt wird
(char*)devCap + devCap->dwLineNameOffsetEs passiert also logisch nicht dasselbe.
Wenn du den 1. Code in die Form des 2. bringen willst muss die Klammerung anders gemacht werden.
reinterpret_cast<char*>(devCap) + devCap->dwLineNameOffset
-
er meint damit, dass die beiden codefragmente sich unterscheiden. das eine castet (pointer+offset), das andere castet pointer und addiert dann erst den offset. das ist ein großer unterschied.
unabhängig davon ist extractString ein ziemlich mieses stück code. hast du die aus den 80ern mitgebracht?
-
() schrieb:
Operatoren haben eine gewisse Rangfolge.
Das hat mir im ersten Post gefehlt. Das habe ich vergessen.
unabhängig davon ist extractString ein ziemlich mieses stück code. hast du die aus den 80ern mitgebracht?
Meine Erste Variante war:
std::string(reinterpret_cast<char*>(devCap + devCap->dwLineNameOffset), devCap->dwLineNameSize); /* Korrektur */ std::string(reinterpret_cast<char*>(devCap) + devCap->dwLineNameOffset, devCap->dwLineNameSize);Die werde ich wohl wieder nehmen können

peace
-
Ich will mal gar nicht wissen, was devCap ist... wtfs sterben eben nicht aus.
-
camper schrieb:
Ich will mal gar nicht wissen, was devCap ist... wtfs sterben eben nicht aus.
Im Ersten Post auf den Link klicken ...
Man muss tun was man für seinen Lohn halt tun muss...
-
xGhost schrieb:
Man muss tun was man für seinen Lohn halt tun muss...
Stimmt, wir werden ja für unsere Antworten bezahlt...
