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位指针。
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
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类型
struct __POSITION { int unused; } ;
typedef __POSITION * POSITION ;
6.0中才变为:
struct __POSITION { } ;
typedef __POSITION * POSITION ;
虽然结构内没有成员变量,但指向结构的指针仍需要4字节----32位机中天下的指针都是这个长度滴!
这样做的目的仅是为了类型安全。对于POSITION参数,使用者很容易传错,特别是当表中元素是void *时,此时很有可能在需要元素的地方传入POSITION,而在需要POSITION的地方传入void *。当做上面的定义中,编译器就可以检查出这种错误。
在MFC内部,POSITION实际上指向CNode类型