CString:(TCHAR *)(这个+ 1)是什么意思?

时间:2009-12-02 10:14:20

标签: mfc c-strings ofc

在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)。

感谢任何帮助。

3 个答案:

答案 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 *