博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

CalmArrow

【打好基础】全力以赴,顺其自然【每天进步一点点】
  piaoxiang.cublog.cn

关于作者
姓名:CalmArrow(lqm)
职业:硕士在读
位置:山东济南
研究:嵌入式系统设计
联系:piaoxiangxinling@163.com

信仰:
    1、永远保持积极向上(积极的心态,积极的思考,积极的行动),享受生活给予的一切!
    2、做正确的事,正确的做事;用心去做,做到最好!
    3、如果你觉得不幸福,那么请你把幸福的门槛降低一些,不要把幸福拒之门外。。。

方向:
    在嵌入式系统设计中感兴趣的方向有:ARM、Linux、网络通信

目标:
    软硬结合,打好基础,提高学习能力,完善知识体系,建立核心优势。

方法:
    理论与实践相结合
    深度与广度相结合
    理解与记忆相结合

说明:
    本Blog仅供学习之用,转载文章如涉及版权,请通知。原创作品如转载,请注明出处。
|| << >> ||
我的分类


C99中struct的高级用法
    在Linux移植过程中,看到源代码中对struct应用很多。特别是在复杂应用结构中,有两种基本的用法,以前没有用过。现在整理总结一下,提高认识。

    1、struct在代码中常见两种基本形式。

    1)struct A {
          成员
       };

    2) struct {
          成员
       }A;

    这两种用法是不同的。1)是结构体类型定义,也就是说定义了一个叫做A的结构体;2)是结构体变量定义,也就是为该匿名结构体定义了一个变量。当然,这两种用法也可以结合起来,如:

    struct A {
          成员
    }a;

    表示定义了一个叫做A的结构体,并且为A定义了一个变量a。

    2、常见的结构体定义过程中初始化的方法如下:

    struct A {
          成员
    }a = {
          初始化值
    };

    这种用法在程序设计时也常用到。但是,不方便的地方在于,必须严格按照成员与成员初始化值一一对应的方式,而且如果设计复杂结构体嵌套,对成员就不是非常清晰了。所以,为了能够为某个或者某些成员赋值,而且忽略顺序,C99提供了"."(C99 designated initializer)。设计了一个简单的实例来说明用法。

#include <stdio.h>

typedef unsigned int u_int32_t;

/* get number of members in array or struct */
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

/* 结构体类型定义 */
struct mtd_partition {
        char *name;
        u_int32_t size;
        u_int32_t offset;
        u_int32_t mask_flags;
};

/* 定义结构体数组,采用两种方式进行部分成员初始化 */
struct mtd_partition nor_partion[] = {
        /* 1 c99 usage */
        {
                .name   =   "NOR Partion 1",
                .offset =   0,
                .size   =   1,
        },
        /* 2 gcc extension */
        {
                name   :   "NAND Partion 1",
                offset :   0,
                size   :   1,
        }
};

int main(void)
{
        int i, n;

        n = ARRAY_SIZE(nor_partion);

        for (i=0; i<n; i++) {
                printf("%s\t%d\t%d\n", nor_partion[i].name,
                                nor_partion[i].offset,
                                nor_partion[i].size);
        }

        return 0;
}


    上面的nor_partion的第一个成员的初始化是C99标准,基本用法是.成员=初始值,第二个成员的初始化则是采用gcc扩展用法(成员:初始值)。这两种用法在Linux内核源代码中应用广泛,应该掌握。

    3、用到了struct,也需要考虑typedef。typedef是C语言的关键字,作用就是为一种数据类型定义一个新的名字。在程序设计中使用typedef,我所知道的作用有:1)提高程序的可移植性。比如,有些数据类型的长度在不同机器上是不一致的,linux/types.h中即是使用typedef来实现了可移植的数据类型。2)提高程序的可读性。可以为有多种用途的结构体赋予不同的别名,有助于阅读。3)简化一些复杂的类型声明。比如,函数指针类型声明。对应前面struct,应用typedef也可以有两种:

    1)typedef struct A {
          成员
       }AA;

    2) typedef struct {
          成员
       }AA;

    其中,1)为结构体A起了一个别名AA,2)为一个匿名结构体起了一个名字AA。使用比较广泛的是2)。当然,有些时候必须使用1)。注意,使用struct进行结构体定义,那么定义变量时必须使用struct 结构体名 变量名;,而使用typedef,则可以直接使用结构体名 变量名

发表于: 2008-03-11,修改于: 2008-03-11 16:22,已浏览844次,有评论1条 推荐 投诉


网友评论
网友: fera 时间:2008-03-13 10:53:34 IP地址:202.96.60.★
Basic but useful.

 发表评论