930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 7468|回复: 1

C99标准中结构体的指定初始化

[复制链接]

27

主题

72

帖子

384

积分

版主

Rank: 7Rank: 7Rank: 7

积分
384
发表于 2016-8-4 23:02:09 | 显示全部楼层 |阅读模式
本帖最后由 飞宇 于 2016-8-4 23:44 编辑

    先看一段代码 (NRF51822开发板配套程序[基础实验9-看门狗实验]中的看门狗初始化的一段代码)。
  1. //定义一个看门狗的配置结构体,并用默认的参数初始化结构体
  2. nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;

  3. #define NRF_DRV_WDT_DEAFULT_CONFIG                    \
  4. {                                                     \
  5.     .behaviour              = WDT_CONFIG_BEHAVIOUR,   \
  6.     .reload_value          = WDT_CONFIG_RELOAD_VALUE,  \
  7.     .interrupt_priority   = WDT_CONFIG_IRQ_PRIORITY,   \
  8. }
复制代码
    其中nrf_drv_wdt_config_t是我们声明的一个结构体,用于配置看门狗时使用。
  1. typedef struct
  2. {
  3.     nrf_wdt_behaviour_t  behaviour;  /*当CPU处于sleep/halt模式时看门狗的动作 */
  4.     uint32_t            reload_value;       /*看门狗重载数值,单位:ms  */
  5.     uint8_t             interrupt_priority;   /* 看门狗中断优先级 */
  6. } nrf_drv_wdt_config_t;
复制代码

    为了看得更清楚,我们去掉代码中的宏定义,将代码整理如下:
  1. nrf_drv_wdt_config_t config =
  2. {                                                     
  3.     .behaviour            = WDT_CONFIG_BEHAVIOUR,   
  4.     .reload_value         = WDT_CONFIG_RELOAD_VALUE,
  5.     .interrupt_priority   = WDT_CONFIG_IRQ_PRIORITY,   
  6. }
复制代码
    在这段代码中,我们可以看到,这种结构体的初始化方式和我们平常用的很不一样。这就是C99标准中的一种新的结构体的初始化方式,被称为:结构体的指定初始化使用这种方式来初始化结构体的好处就在于:不需要严格按照结构体定义中的成员变量的顺序来进行初始化看下面的一个例子,对比一下两种接种结构体的初始化方式,很明显,指定初始化会灵活很多,因为我们初始化时不需要再去关心成员变量的顺序了。
  1. //声明一个结构体,用于记录学生考试成绩
  2. struct student_st
  3. {
  4.     char c;
  5.     int score;
  6.     const char *name;
  7. };
  8. //结构体初始化,必须严格按照成员变量的顺序来初始化
  9. struct student A = {'A', 91, "Alan"};
  10. //指定初始化,可以按照任意顺序来初始化
  11. struct student A =
  12. {
  13.     .name = "LIFENG",
  14.     .c = 'B',
  15.     .score = 96,
  16. };
复制代码
    最后,不要忘记在MDK开发环境中勾选“C99 Mode”,如下图所示,否则,编译程序时会报错。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

6

帖子

30

积分

新手上路

Rank: 1

积分
30
发表于 2017-4-11 23:59:11 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

Copyright © 合肥艾克姆电子科技有限公司
快速回复 返回顶部 返回列表