Pergunta

No arquivo de cabeçalho CString (seja Foundation Classes Aberta da Microsoft ou - http: / /www.koders.com/cpp/fid035C2F57DD64DBF54840B7C00EA7105DFDAA0EBD.aspx#L77 ), há o seguinte trecho de código

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

O que faz o (TCHAR *) (e este [1]) indica?

O struct CStringData é usado na classe CString. (Http: // www.koders.com/cpp/fid100CC41B9D5E1056ED98FA36228968320362C4C1.aspx)

Qualquer ajuda é apreciada.

Foi útil?

Solução

CString tem muitos truques internos que fazem com que pareça uma string normal quando passava por exemplo às funções printf, apesar de realmente ser uma classe - sem ter que convertê-lo para LPCTSTR na lista de argumentos, por exemplo, no caso de varargs (...) em, por exemplo, um printf . Assim, tentando entender um único truque indivíduo ou função na implementação CString é uma má notícia. (A função de dados é uma função interna que recebe o 'real' buffer associado com a corda.)

Há um livro, Internals MFC que entra nele, e IIRC o livro Blaszczak pode tocá-lo.

EDIT: Quanto ao que a expressão realmente se traduz em em termos de matéria-C ++: -

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

este diz "fingir que você é, na verdade, a primeira entrada em uma matriz de itens alocados juntos Agora, o segundo artigo não é realmente um CString, é um NUL normais terminados tampão de Unicode ou normais personagens -. Ou seja, um LPTSTR" .

Outra forma de expressar a mesma coisa é:

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

Quando você adiciona 1 para um ponteiro para T, você realmente adicionar 1 * sizeof T em termos de um endereço de memória cru. Portanto, se um tem um CString localizado na 0x00000010 com sizeof (CString) = 4, os dados vai devolver um apontador para um NUL terminada matriz de caracteres a partir de tampão 0x00000014

Mas só entender uma coisa fora do contexto is not necessariamente uma boa idéia.

Por que você necessidade saber?

Outras dicas

Ele retorna a área da memória que é imediatamente após a estrutura CStringData como um array de caracteres TCHAR.

Você pode entender porque eles estão fazendo isso, se você olhar para o 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));

Eles fazem este truque, para que CString parece um buffer de dados normal, e quando você perguntar para o getdata ele ignora a estrutura CStringData e aponta diretamente para os dados reais tampão como char *

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top