在CString的头文件(可以是微软的或开放式基础类 - HTTP:/ /www.koders.com/cpp/fid035C2F57DD64DBF54840B7C00EA7105DFDAA0EBD.aspx#L77 ),有以下代码片段

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

什么的(TCHAR *)(&此[1])表示?

在CStringData结构也是在CString类使用(HTTP:// www.koders.com/cpp/fid100CC41B9D5E1056ED98FA36228968320362C4C1.aspx)。

任何帮助理解。

有帮助吗?

解决方案

CString的拥有大量内部招数,这使得它看起来像一个正常的字符串例如通过时的到printf功能,尽管实际上是一类 - 的而无需将其丢在参数列表中,例如,以LPCTSTR,在varargs...)的情况下,在例如一个printf 即可。因此,试图了解在CString的实现单个人技巧或功能是个坏消息。 (数据功能是一个内部功能,其获取与所述串相关联的“真正的”缓冲器。)

有一本书,MFC内幕是进入它,并IIRC的Blaszczak书会去碰它。

编辑:至于什么表达实际上转化为原料中C为++: -

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

这说“假装你实际上是在分配共同项目的数组的第一个条目现在,第二项心不是实际上是一个CString,这是一个正常的NUL终止Unicode或普通字符的缓冲 - 也就是说,一个LPTSTR”

表达同样的事情的另一种方法是:

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

当添加1的指针T,你实际上在原始存储器地址而言添加1 *的sizeof吨。因此,如果一个具有位于0x00000010用的sizeof(CString的)= 4一个CString,数据将返回一个指向到一个NUL终止字符的数组缓冲区开始于0x00000014

但是,仅仅理解这一点断章取义心不是必然是个好主意。

为什么你的需要的知道吗?

其他提示

它返回存储区紧接在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));

他们做这一招,使CString的看起来像一个正常的数据缓冲区,当你问的GetData直接跳过CStringData结构和点状炭真实数据缓冲区*

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top