CString: O que faz (TCHAR *) (esta + 1) média?
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.
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 *