CString : (TCHAR*)(this + 1) 是啥意思?
Posted
技术标签:
【中文标题】CString : (TCHAR*)(this + 1) 是啥意思?【英文标题】:CString : What does (TCHAR*)(this + 1) mean?CString : (TCHAR*)(this + 1) 是什么意思? 【发布时间】:2009-12-02 10:14:19 【问题描述】:在 CString 头文件中(无论是 Microsoft 的还是 Open Foundation Classes - http://www.koders.com/cpp/fid035C2F57DD64DBF54840B7C00EA7105DFDAA0EBD.aspx#L77 ),有以下代码 sn-p
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)。
感谢任何帮助。
【问题讨论】:
【参考方案1】: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 时,你实际上是在原始内存地址方面加上 1* sizeof T。因此,如果一个 CString 位于 0x00000010 且 sizeof(CString) = 4,则 data 将返回一个指针,指向从 0x00000014 开始的 NUL 终止的字符缓冲区数组
但仅仅脱离上下文理解这一件事并不一定是个好主意。
为什么你需要知道?
【讨论】:
这里指的不是MFC,而是OFC。 @kgiannakakis:没有点击链接或阅读问题,呵呵。但是原因可能是相同的 @Ruben:谢谢。我想我是根据你的回复和 kgiannakakis 的回复想出来的。 (this + 1) 基本上指向可以找到实际内容的 CString 类型的偏移量。 mem_alloc 语句使其更清晰。这只是一个学习练习。因此问题。 很好,ta 表示“不接受”。我+1'd kgiannakakis(除了它是一个可以帮助您了解正在发生的事情的有效答案之外,还促使我改进我的答案超出其初始状态)并且您也应该 IMNSHO :D【参考方案2】:它将紧跟在 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));
【讨论】:
@kgiannakakis: 看起来不像是 MFC 的 CString 的重新实现,所以他们这样做的原因(使人们能够在 printf 中将 CString 传递给...
而无需显式转换)立场。【参考方案3】:
他们这样做了,所以 CString 看起来像一个普通的数据缓冲区,当你请求 getdata 时,它会跳过 CStringData 结构并直接指向真正的数据缓冲区,如 char*
【讨论】:
以上是关于CString : (TCHAR*)(this + 1) 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
String,CString,TCHAR,char之间区别和联系