在CString头文件(无论是Microsoft的还是Open Foundation Classes - http://www.koders.com/cpp/fid035C2F57DD64DBF54840B7C00EA7105DFDAA0EBD.aspx#L77)中,有以下代码片段
struct CStringData
{
long nRefs;
int nDataLength;
int nAllocLength;
TCHAR* data() { return (TCHAR*)(&this[1]); };
...
};
(TCHAR *)(& this [1])表示什么?
CStringData结构用于CString类(http:// www.koders.com/cpp/fid100CC41B9D5E1056ED98FA36228968320362C4C1.aspx)。
感谢任何帮助。
答案 0 :(得分:2)
CString有许多内部技巧,使其在传递时看起来像普通字符串,例如到printf
函数,尽管实际上是一个类 - 而不必在参数列表中将其强制转换为LPCTSTR
,例如,在varargs
(...
的情况下例如printf
。因此,尝试理解CString实现中的单个技巧或功能是个坏消息。 (数据函数是一个内部函数,它获取与字符串相关的'真实'缓冲区。)
有一本书,MFC Internals进入它,而IIRC Blaszczak的书可能触及它。
编辑:关于表达式实际转换为原始C ++的内容: -
TCHAR* data() { return (TCHAR*)(&this[1]); };
这说“假装你实际上是分配在一起的项目数组中的第一个条目。现在,第二个项目实际上不是CString
,它是一个正常的NUL终止的Unicode或普通字符的缓冲区 - 即,LPTSTR“。
表达同样事物的另一种方式是:
TCHAR* data() { return (TCHAR*)(this + 1); };
当你向T添加一个指针时,你实际上就原始内存地址添加1 * sizeof T.因此,如果一个CString位于0x00000010且sizeof(CString)= 4,则数据将返回一个指向NUL终止的字符缓冲区数组的指针,从0x00000014开始
但只是理解这一点脱离背景并不一定是个好主意。
为什么需要知道?
答案 1 :(得分:1)
它将紧跟CStringData结构之后的内存区域返回为TCHAR字符数组。
如果查看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));
答案 2 :(得分:0)
他们这样做,所以CString看起来像一个普通的数据缓冲区,当你要求getdata时,它跳过CStringData结构并直接指向真实的数据缓冲区,如char *