CString: Qu'est-ce que (TCHAR *) (ce + 1) signifie?
Question
Dans le fichier d'en-tête de CString (que ce soit les classes Microsoft ou Open Foundation - http: / /www.koders.com/cpp/fid035C2F57DD64DBF54840B7C00EA7105DFDAA0EBD.aspx#L77 ), il y a le fragment de code suivant
struct CStringData
{
long nRefs;
int nDataLength;
int nAllocLength;
TCHAR* data() { return (TCHAR*)(&this[1]); };
...
};
Qu'est-ce que le (TCHAR *) (et ce [1]) indiquer?
Le struct CStringData est utilisé dans la classe CString (http: // www.koders.com/cpp/fid100CC41B9D5E1056ED98FA36228968320362C4C1.aspx).
Toute aide est appréciée.
La solution
CString a beaucoup de trucs internes qui la font ressembler à une chaîne normale lorsqu'il est passé par exemple à printf
fonctions, en dépit d'être en fait une classe - sans avoir à jeter à LPCTSTR
dans la liste des arguments, par exemple, dans le cas de varargs
(...
) par exemple, dans un printf
. Ainsi, en essayant de comprendre un truc seule personne ou fonction dans la mise en œuvre de CString mauvaises nouvelles. (La fonction de données est une fonction interne qui reçoit le tampon « réel » associé à la chaîne.)
Il y a un livre, MFC Internes qui en est faite, et IIRC le livre Blaszczak pourrait toucher.
EDIT: En ce qui concerne ce que l'expression se traduit en fait en termes de C ++ brut: -
TCHAR* data() { return (TCHAR*)(&this[1]); };
dit «prétendre que vous êtes en fait la première entrée dans un tableau d'éléments attribués ensemble maintenant, le deuxième élément isnt en fait un CString
, il est un tampon fin NUL normale soit des caractères Unicode ou normal - à savoir, un LPTSTR » .
Une autre façon d'exprimer la même chose est:
TCHAR* data() { return (TCHAR*)(this + 1); };
Lorsque vous ajoutez 1 à un pointeur à T, vous ajoutez en fait 1 * sizeof T en termes d'une adresse mémoire brute. Donc, si l'on a un CString situé à 0x00000010 avec sizeof (CString) = 4, les données renvoie un pointeur vers un réseau à terminaison NUL de caractère tampon de départ à 0x00000014
Mais juste comprendre une chose sur isnt contexte nécessairement une bonne idée.
Pourquoi vous besoin de savoir?
Autres conseils
Elle retourne la zone de mémoire qui est immédiatement après la structure CStringData comme un tableau de caractères TCHAR.
Vous pouvez comprendre pourquoi ils font cela si vous regardez le CString. dossier de cpp:
static const struct {
CStringData data;
TCHAR ch;
} str_empty = {{-1, 0, 0}, 0};
CStringData* pData = (CStringData*)mem_alloc(sizeof(CStringData) + size*sizeof(TCHAR));
Ils font cette astuce, de sorte que CString ressemble à un tampon de données normale, et lorsque vous demandez les getdata il saute la structure et les points CStringData directement au réel tampon de données comme char *