分享

关于匿名结构体的使用技巧

 quasiceo 2015-01-15
Programming 春风细雨1年前 (2013-08-06) 2928浏览 0评论

  匿名结构体(anonymous struct)是指声明结构体时没有指定结构体类型名的结构体,与共用体(union)联合使用时,方显其方便之能。

声明一个结构体类型的一般形式为:
1
2
3
4
struct 结构体类型名
{
    成员表列; ?
};
摘自WinNT.h:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define DUMMYSTRUCTNAME
typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
    LONGLONG QuadPart;
} LARGE_INTEGER;

  如上代码摘自winnt.h,上述代码使用 typedef 对已声明的共用体(union)类型名 _LARGE_INTEGER 声明了一个新的类型名 LARGE_INTEGER(可称“别名”)。

定义匿名结构体类型变量的形式如下:
1
2
3
4
struct   //注意没有结构体类型名
{
    成员表列;
} 变量名;

  _LARGE_INTEGER共用体中两个结构体具有相同的数据成员类型。第一个无类型名的结构体声明的变量名为DUMMYSTRUCTNAME,意为“假的结构体名”,第一行代码将DUMMYSTRUCTNAME定义为空,即无结构体变量名;第二个结构体类型名也没有,但声明了变量名为u。存在即是合理,这两个结构体分别为何意呢?

示例1:(此为兼容多年前匿名结构体需声明变量之正常用法代码)
1
2
3
LARGE_INTEGER liFileSize ;
liFileSize.u.LowPart  = 1000 ;
liFileSize.u.HighPart = 2000 ;
示例2:(可直接调用union中没有声明变量名的匿名结构体之成员,只为方便)
1
2
3
LARGE_INTEGER liFileSize ;
liFileSize.LowPart  = 1000 ;
liFileSize.HighPart = 2000 ;

  多年前,使用匿名结构体需要声明变量,则要按示例2所示正常语法格式访问结构体中数据成员变量。

  多年前的多年后,匿名结构体可以在union中不声明结构体变量,即可直接使用union定义的变量访问匿名结构体中的成员,因为没有结构体变量名嘛,也只能直接访问了,就更加方便了。

  如今LARGE_INTEGER结构中依然保留有声明变量名为u的上述第2种结构体,则是为了兼容多年前写的通过声明的结构体变量名u访问其成员变量的代码。

转载请注明:春风细雨's Blog 关于匿名结构体的使用技巧

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多