Frage

In der CString-Header-Datei (sei es Microsoft oder Open Foundation Classes - http: / /www.koders.com/cpp/fid035C2F57DD64DBF54840B7C00EA7105DFDAA0EBD.aspx#L77 ), gibt es den folgenden Code-Schnipsel

struct CStringData
{   
    long nRefs;
    int nDataLength;
    int nAllocLength;
    TCHAR* data() { return (TCHAR*)(&this[1]); };
    ...
};

Was bedeutet die (TCHAR *) (auf diesem [1]) an?

Die CStringData Struktur ist in der CString Klasse verwendet (http: // www.koders.com/cpp/fid100CC41B9D5E1056ED98FA36228968320362C4C1.aspx).

Jede Hilfe ist willkommen.

War es hilfreich?

Lösung

CString hat viele interne Tricks, die es wie eine normale Zeichenfolge aussehen zu lassen, wenn beispielsweise weitergegeben Funktionen printf trotz eigentlich eine Klasse zu sein - ohne sie zu werfen, die in der Argumentliste LPCTSTR, zum Beispiel im Fall von varargs (...) in z.B. ein printf . So versuchen, ein einzelnes Individuum Trick oder Funktion in der CString Implementierung zu verstehen, ist eine schlechte Nachricht. (Die Datenfunktion ist eine interne Funktion, die den ‚echten‘ Puffer mit der Zeichenfolge zugeordnet wird.)

Es ist ein Buch, MFC-Interna, die in es geht, und IIRC das Blaszczak Buch könnte es berühren.

EDIT: Was, was der Ausdruck übersetzt tatsächlich in Bezug auf die rohen C ++: -

TCHAR* data() { return (TCHAR*)(&this[1]); };

das sagt. „So tun, als Sie tatsächlich der erste Eintrag in einem Array von Elementen zusammen zugeordnet sind nun das zweite Element ist nicht eigentlich ein CString, dann ist es ein normaler NUL beendet Puffer entweder Unicode oder normale Zeichen - dh einer LPTSTR“ .

Eine andere Möglichkeit, das gleiche auszudrücken, ist:

TCHAR* data() { return (TCHAR*)(this + 1); };

Wenn Sie 1 auf einen Zeiger auf T hinzufügen möchten, fügen Sie eigentlich 1 * sizeof T in Form einer rohen Speicheradresse. Also, wenn man eine CString bei 0x00000010 mit sizeof (CString) gelegen hat = 4, werden die Daten einen Zeiger auf ein NUL terminierte Array von Zeichen auf 0x00000014

Startpuffer

Aber gerade das Verständnis diese eine Sache aus dem Zusammenhang gerissen ist nicht unbedingt eine gute Idee.

Warum Sie Notwendigkeit wissen?

Andere Tipps

Es gibt den Speicherbereich, der unmittelbar nach der CStringData Struktur als ein Array von TCHAR Zeichen ist.

Sie können verstehen, warum sie dies tun, wenn Sie auf der CString. cav Datei:

static const struct {
    CStringData data;
    TCHAR ch;
} str_empty = {{-1, 0, 0}, 0};

CStringData* pData = (CStringData*)mem_alloc(sizeof(CStringData) + size*sizeof(TCHAR));

Sie haben diesen Trick, so dass CString wie ein normaler Datenpuffer aussieht, und wenn Sie für die getdata fragen überspringt er die CStringData Struktur und zeigt direkt auf die realen Datenpuffer wie char *

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top