这是什么类型的C结构?

时间:2017-11-09 13:47:51

标签: c

这种结构代表什么?第一个方括号[last_ds_type]显示结构的数组。像[ds_1307]这样的内方括号怎么样? ..nvram_offset中的.nvram_size是什么?

static struct chip_desc chips[last_ds_type] = {
  [ds_1307] = {
    .nvram_offset  = 8,
    .nvram_size  = 56,
  },
  [ds_1308] = {
    .nvram_offset  = 8,
    .nvram_size  = 56,
  },
  [ds_1337] = {
    .alarm    = 1,
    .century_reg  = DS1307_REG_MONTH,
    .century_bit  = DS1337_BIT_CENTURY,
  },
  [ds_1338] = {
    .nvram_offset  = 8,
    .nvram_size  = 56,
  },
  [ds_1339] = {
    .alarm    = 1,
    .century_reg  = DS1307_REG_MONTH,
    .century_bit  = DS1337_BIT_CENTURY,
    .trickle_charger_reg = 0x10,
    .do_trickle_setup = &do_trickle_setup_ds1339,
  },
  [ds_1340] = {
    .century_reg  = DS1307_REG_HOUR,
    .century_enable_bit = DS1340_BIT_CENTURY_EN,
    .century_bit  = DS1340_BIT_CENTURY,
    .trickle_charger_reg = 0x08,
  },
  [ds_1388] = {
    .trickle_charger_reg = 0x0a,
  },
  [ds_3231] = {
    .alarm    = 1,
    .century_reg  = DS1307_REG_MONTH,
    .century_bit  = DS1337_BIT_CENTURY,
  },
  [rx_8130] = {
    .alarm    = 1,
    /* this is battery backed SRAM */
    .nvram_offset  = 0x20,
    .nvram_size  = 4,  /* 32bit (4 word x 8 bit) */
  },
  [mcp794xx] = {
    .alarm    = 1,
    /* this is battery backed SRAM */
    .nvram_offset  = 0x20,
    .nvram_size  = 0x40,
  }
};

3 个答案:

答案 0 :(得分:2)

这个struct数组正在使用数组指定的初始化语法将数组中的特定元素初始化为某个值。

ds_1307等每个标记很可能是一个评估整数的宏。

.member表示法是另一种指定的初始化程序,程序员用它来初始化数组的特定元素的成员。未明确设置的成员将设置为与实例具有static存储持续时间时相同的值。

另见what is a designated initializer in c?

答案 1 :(得分:1)

[ds_1307] = {
    .nvram_offset   = 8,
    .nvram_size = 56,
}

表示元素编号ds_1307,它很可能是这样的宏:

#define ds_1307             1
使用nvram_offset = 8和nvram_size = 56初始化的结构数组中的

更简单的例子:

char array[2] = { [0] = 'a', [1] = 'b' };

相当于

array[0] = 'a'
array[1] = 'b'    

答案 2 :(得分:0)

这里芯片[last_ds_type]是chip_desc类型的结构数组。 此代码是RTC driver的一部分,您可以访问此链接https://github.com/rushup/Kitra710-kernel/blob/master/drivers/rtc/rtc-ds1307.c 在这里,您将找到一个RTC驱动程序代码,其中解释了您想要了解的内容。