Mfc CString:TCHAR*是什么意思?
在cStand头文件(无论是微软的还是开放的基础类),有下面的代码片段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.
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
(…
)例如,在aprintf
中。因此,试图理解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));