Mfc CString:TCHAR*是什么意思?

Mfc CString:TCHAR*是什么意思?,mfc,c-strings,ofc,Mfc,C Strings,Ofc,在cStand头文件(无论是微软的还是开放的基础类),有下面的代码片段 struct CStringData { long nRefs; int nDataLength; int nAllocLength; TCHAR* data() { return (TCHAR*)(&this[1]); }; ... }; (TCHAR*)(&this[1])表示什么 CStringData结构用于CString类(http://www.koders.

在cStand头文件(无论是微软的还是开放的基础类),有下面的代码片段

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)


非常感谢您的帮助。

CString有许多内部技巧,使其在传递到
printf
函数时看起来像一个普通字符串,尽管它实际上是一个类-,而不必将其强制转换到参数列表中的
LPCTSTR
,例如
varargs
)例如,在a
printf
中。因此,试图理解CString实现中的单个技巧或函数是个坏消息。(数据函数是一个内部函数,用于获取与字符串关联的“实”缓冲区。)

有一本书,里面有MFC的内部结构,而IIRC Blaszczak的书可能会碰到它

编辑:对于表达式在原始C++中的实际转换:-

TCHAR* data() { return (TCHAR*)(&this[1]); };
这表示“假设您实际上是一起分配的项目数组中的第一个项目。现在,第二个项目实际上不是
CString
,它是一个由Unicode或普通字符组成的以NUL结尾的正常缓冲区,即LPTSTR”

表达相同事物的另一种方式是:

TCHAR* data() { return (TCHAR*)(this + 1); };
当您将1添加到指向T的指针时,实际上是在原始内存地址中添加了1*sizeof T。因此,如果一个CString位于0x00000010,且sizeof(CString)=4,则数据将返回指向从0x00000014开始的以NUL结尾的字符缓冲区数组的指针

但仅仅断章取义地理解这一点并不一定是个好主意


为什么您需要知道?

它以TCHAR字符数组的形式返回紧接CStringData结构之后的内存区域

如果查看文件,您可以理解他们为什么这样做:


他们这样做,使CString看起来像一个普通的数据缓冲区,当你要求获取数据时,它跳过CStringData结构,直接指向真正的数据缓冲区,如char*

这不是指MFC,而是指OFC。@kgiannakakis:没有遵循链接或阅读问题,doh。然而,原因可能是same@Ruben:谢谢你。我想我是根据你的回答和kgiannakakis的回答猜出来的。(this+1)基本上指向CString类型的偏移量,在这里可以找到实际内容。mem_alloc声明使其更加清晰。这只是一个学习练习。这就是问题所在。太好了,ta不接受。I+1'd Kgiannakis(鼓励我改进我的答案,使其超越初始状态,此外,它是一个有效的答案,有助于你理解发生了什么),你也应该:D@kgiannakakis当前位置看起来不像是MFC CString的重新示例,所以他们这样做的原因是什么(使人能够将CString传递到printf中的
,而无需显式转换)支架。
static const struct {
    CStringData data;
    TCHAR ch;
} str_empty = {{-1, 0, 0}, 0};

CStringData* pData = (CStringData*)mem_alloc(sizeof(CStringData) + size*sizeof(TCHAR));