当前位置:C++技术网 > 资讯 > 数据类型:4 宏、常量、枚举、结构体和共用体对比分析之结构体

数据类型:4 宏、常量、枚举、结构体和共用体对比分析之结构体

更新时间:2015-06-23 17:03:26浏览次数:1+次

    第三篇  结构体
    结构体是在开发中用得最多的一种数据类型。因为经常有各种协议,各种业务逻辑结构等等,没有结构体,定义起来是很麻烦的。当然我们也是可以做到的,比如20个字节的协议,我们可以存放到数组中,然后对数组中的元素按照下标来分析。不过,这样的效率很低,并且很不直观。哪个元素代表什么很难一眼看出来,这个后期的维护是一个很大的挑战。同时在开发时,也不是一件容易的事。结构体正是这个需求而设计出来的。有了结构体后,对这些协议进行划分,就相当容易了,且容易理解,不用去对缓冲中的字节进行挨个的查找分析,只要对结构体的成员拿来分析即可,而结构体成员的使用和普通变量一样,只是要在结构体变量加个点号就可以使用结构体的成员了。
    结构体和枚举很相像,也是用来定义自定义数据类型的,struct本身不是类型,而是用来定义类型的关键字而已。说一个类型是结构体类型是不准确的,因为每一种结构体都可能不一样。定义方法和枚举类似,同样也是有匿名的结构体类型和有名字的结构体类型。使用上也是用点号引用内部的成员的,这和类对象是一样的用法。结构体本质上也是一种类,是所有成员(包括变量和函数)都是public的访问权限的类。因为在安全控制方面的不足,因此才让类来填补了这些不足。而结构体则主要用作自定义类型,而这也是设计它的初衷。
    struct 类型名{变量声明列表};
    struct {变量声明列表};
    类型名就可以当做一般的类型名如整型来声明变量,而匿名的结构体类型,则要么将全部定义作为类型来声明或者为了简化代码则使用typedef来重定义类型。具体的在枚举中讨论了,这里就不详述,不清楚的请查看上一篇讲述的枚举部分。
    这里没有具体的讲述结构体的各方面的语法细节,只是将核心的注意的地方强调一下,如果这些不掌握清楚,那肯定日后会遇到迷糊。
    还要注意的一点,对于常规的类型组成的结构体,使用起来基本没问题。但是,在使用到了复杂的数据类型,如动态数组,容器等类型时,因为组成结构体的成员的类型是变长的,所以其长度不是一直不变的。如果不注意这个问题,当程序复杂了后,往往会带来内存访问错误问题。所以,此时为了防止这方面的问题,一般在定义结构体类型时,第一个成员设置为一个统计结构体大小的整型类型,这样可以提高安全性,避免内存访问错误问题。不过一般基本类型,也就是长度完全可以确定,且一直不变的,没有很大的必要增加这个成员。不过微软建议,为了养成好的安全习惯,平时在定义结构体类型最好增加第一个统计结构体大小的成员。可以在MSDN中见到很多结构体的第一个成员就是整型,用以统计结构体大小。有的函数很严格,如果传递给函数的结构体结构体大小成员不合适都不能执行。不过我个人认为,我们不一定要完全遵守他人的建议,但是必须要做到,对这些东西内部机制要有透彻的了解,使用时成竹在胸,而不是盲目的遵守别人的约定和习惯建议,要有一套符合自己习惯的编程风格。
    结构体其他方面倒是没什么大问题,如果有确实经常遇到的而我疏于考虑的话,请指出,相互交流学习。