tagVARIANT的成员变量问题

开心秋水 2017-07-02 03:55:17
tagVARIANT是COM技术中常使用的一个类,在OAIdl.h中 在可以用它来保存不同的数据类型:


struct tagVARIANT
{
union
{
struct __tagVARIANT
{
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union
{
LONGLONG llVal;
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
VARIANT_BOOL boolVal;
_VARIANT_BOOL bool;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
IUnknown *punkVal;
IDispatch *pdispVal;
SAFEARRAY *parray;
BYTE *pbVal;
SHORT *piVal;
LONG *plVal;
LONGLONG *pllVal;
FLOAT *pfltVal;
DOUBLE *pdblVal;
VARIANT_BOOL *pboolVal;
_VARIANT_BOOL *pbool;
SCODE *pscode;
CY *pcyVal;
DATE *pdate;
BSTR *pbstrVal;
IUnknown **ppunkVal;
IDispatch **ppdispVal;
SAFEARRAY **pparray;
VARIANT *pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
ULONGLONG ullVal;
INT intVal;
UINT uintVal;
DECIMAL *pdecVal;
CHAR *pcVal;
USHORT *puiVal;
ULONG *pulVal;
ULONGLONG *pullVal;
INT *pintVal;
UINT *puintVal;
struct __tagBRECORD
{
PVOID pvRecord;
IRecordInfo *pRecInfo;
} __VARIANT_NAME_4;
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
} ;

tagVARIANT结构体中, 有一个union(联合体), 此union中有 __tagVARIANT 结构体.
,然后, 这个__tagVARIANT结构体中 又有一个union, 此union 有各种类型的数据.
那么问题来了, vt 是 __tagVARIANT的一个变量, 但tagVARIANT 居然可以直接调用它!
就是说先声明 tagVARIANT a;
然后可以直接调用a.vt, 而不需要通过__tagVARIANT, 要知道, vt 不是tagVARIANT的变量, 而是__tagVARIANT中的变量!
同理, 也可以直接使用a.intVal 或者 a.dblVal 请问这是为什么?
...全文
218 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2017-07-03
  • 打赏
  • 举报
回复
部分编译器允许里面的结构体无命名, 对里面的结构体没有命名 允许这样访问 typedef struct _tagA { struct { int a }; }A; A tA; tA.a = 1; typedef struct _tagB { struct _tagMB{ int a }b; }B; B tB; tb.b.a = 1;

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧