Domanda

Nel file di intestazione CString (sia esso classi aperte Foundation di Microsoft o - http: / /www.koders.com/cpp/fid035C2F57DD64DBF54840B7C00EA7105DFDAA0EBD.aspx#L77 ), v'è il seguente frammento di codice

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

Che cosa significa il (TCHAR *) (e questo [1]) indica?

La struct CStringData viene utilizzato nella classe CString (http: // www.koders.com/cpp/fid100CC41B9D5E1056ED98FA36228968320362C4C1.aspx).

Ogni aiuto è apprezzato.

È stato utile?

Soluzione

CString ha un sacco di trucchi interne che lo rendono l'aspetto di una normale stringa quando viene passato per esempio a printf funzioni, pur essendo in realtà una classe - senza dover cast a LPCTSTR nella lista degli argomenti, ad esempio, nel caso di varargs (...) in es un printf . Così cercando di capire un singolo trick individuo o di una funzione per l'attuazione CString è una cattiva notizia. (La funzione di dati è una funzione interna che ottiene il buffer 'vero' associato con la stringa.)

C'è un libro, MFC Internals che va in esso, e IIRC il libro Blaszczak potrebbe toccarlo.

EDIT: Per quanto riguarda ciò che l'espressione si traduce effettivamente in termini di materie prime C ++: -

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

questo dice "finta che sei in realtà la prima voce in un array di oggetti allocati insieme Ora, la seconda isnt oggetto in realtà un CString, si tratta di un normale termina con NUL di buffer di entrambi Unicode o caratteri normali - cioè un LPTSTR" .

Un altro modo di esprimere la stessa cosa è:

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

Quando si aggiunge 1 ad un puntatore a T, in realtà si aggiunge 1 * sizeof T in termini di un indirizzo di memoria crudo. Quindi, se si ha una CString situata a 0x00000010 con sizeof (CString) = 4, dati restituirà un puntatore a una NUL terminato array di caratteri buffer partendo da 0x00000014

Ma proprio la comprensione di questo una cosa fuori dal contesto isnt necessariamente una buona idea.

Perché necessità di sapere?

Altri suggerimenti

Si restituisce l'area di memoria che è immediatamente dopo che la struttura CStringData come un array di caratteri TCHAR.

Si può capire perché stanno facendo questo se si guarda alla CString. il file cpp :

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

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

Lo fanno questo trucco, in modo che CString si presenta come un buffer di dati normale, e quando si chiede per i getdata salta la struttura CStringData e punti direttamente al buffer di dati reali, come char *

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top