CList POSITION

VC的基本头文件AFX.h里对POSITION是这样定义的: 
struct __POSITION { }; 
typedef __POSITION* POSITION 
显然这里定义了一个没有任何字段的结构体,而POSITION是这个结构体的指针。 

VC在使用CList时,一些函数往往用POSITION参数,或者返回POSITION类型,其实查看CList的原代码就知道,原来CList返回的POSITION就是它的链表的一个结点指针,也就是说,在CList里有一个CNode的类定义了结点,而POSITION就是CNode* 

所以说,虽然__POSITION结构体没有任何字段,但用POSITION结构体指针,仅仅用来表达CNode*指针,并且是强制转换过来的。于是POSITION被VC用为一种常见的数据类型---32位指针。
 

下面是CList中它的用法 
AFX_INLINE   TYPE&   CList <TYPE,   ARG_TYPE> ::GetNext(POSITION&   rPosition)   //   
{   
  CNode*   pNode   =   (CNode*)   rPosition; 
  ASSERT(AfxIsValidAddress(pNode,   sizeof(CNode))); 
  rPosition   =   (POSITION)   pNode-> pNext; 
  return   pNode-> data; 
} 

 

试了试空结构,很奇怪 
struct   SS{}; 
SS   s={0};     会分配4字节内存做s变量,但并不初始化这4字节为0 
int   b=sizeof(SS);   为1 
 
在MFC4.0以前的版本中,POSITION实际上就是一个void指针。在5.0中的定义大概是: 
struct   __POSITION   {   int   unused;   }   ; 
typedef   __POSITION   *   POSITION   ; 
6.0中才变为: 
struct   __POSITION   {     }   ; 
typedef   __POSITION   *   POSITION   ; 
虽然结构内没有成员变量,但指向结构的指针仍需要4字节----32位机中天下的指针都是这个长度滴! 

这样做的目的仅是为了类型安全。对于POSITION参数,使用者很容易传错,特别是当表中元素是void   *时,此时很有可能在需要元素的地方传入POSITION,而在需要POSITION的地方传入void   *。当做上面的定义中,编译器就可以检查出这种错误。 
在MFC内部,POSITION实际上指向CNode类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值