Pregunta

En el archivo de cabecera CString (ya sea Foundation Classes abierto de Microsoft o - http: / /www.koders.com/cpp/fid035C2F57DD64DBF54840B7C00EA7105DFDAA0EBD.aspx#L77 ), existe el siguiente fragmento de código

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

¿Qué hace el (TCHAR *) (y esto [1]) indica?

El struct CStringData se utiliza en la clase CString (http: // www.koders.com/cpp/fid100CC41B9D5E1056ED98FA36228968320362C4C1.aspx).

Cualquier ayuda es apreciada.

¿Fue útil?

Solución

CString tiene un montón de trucos internos que hacen que se vea como una cadena normal cuando pasó por ejemplo, a printf funciones, a pesar de ser en realidad una clase - sin tener que echarlo a LPCTSTR en la lista de argumentos, por ejemplo, en el caso de varargs (...) en, por ejemplo un printf . Por lo tanto tratar de comprender un solo truco individuo o función en la implementación CString es una mala noticia. (La función de datos es una función interna que recibe el tampón 'real' asociado con la cadena.)

Hay un libro, MFC funcionamiento interno que va en ella, y IIRC el libro Blaszczak podría tocarlo.

EDIT: En cuanto a lo que la expresión se traduce en realidad en términos de C ++ en bruto: -

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

este dice "Imagina que eres en realidad la primera entrada en una variedad de temas asignados juntos Ahora, el segundo artículo no está en realidad un CString, es un NUL normal de amortiguamiento de Unicode o caracteres normales terminado - es decir, un LPTSTR" .

Otra forma de expresar lo mismo es:

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

Cuando se agrega 1 a un puntero a T, en realidad se agrega 1 * sizeof T en términos de una dirección de memoria en bruto. Así que si uno tiene una CString situado en 0x00000010 con sizeof (CString) = 4, los datos se devolverá un puntero a una NUL terminado array de caracteres tampón de partida en 0x00000014

Pero la comprensión de una cosa fuera de contexto isnt necesariamente una buena idea.

¿Por qué necesidad saber?

Otros consejos

Devuelve el área de memoria que es inmediatamente después de la estructura CStringData como una matriz de caracteres TCHAR.

Se puede entender por qué están haciendo esto si nos fijamos en la CString. 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 hacen este truco, por lo que CString se parece a un búfer de datos normal, y cuando pida las leedato se salta la estructura y puntos CStringData directamente al buffer de datos real como char *

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top