【问题标题】:What type of C structure it this?这是什么类型的C结构呢?
【发布时间】:2017-11-09 13:47:50
【问题描述】:

这个结构代表什么?第一个方括号[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,
  }
};

【问题讨论】:

  • 那是指定的初始化器。
  • 虽然这可能来自 Linux 设备驱动程序代码,但只有其中的实际标识符是特定于该上下文的。无论如何,您正在查看的是指定的初始化程序。它们指定在每个点初始化数组的哪个元素,以及每个 (struct chip_desc) 数组元素的哪个成员。
  • @HolyBlackCat: 多么奇怪 - 最近一小时内指定初始化程序上的 C 标签上有两个问题;以前从未见过。

标签: c


【解决方案1】:

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

ds_1307 等每个标记很可能是一个计算为整数的宏。

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

另见what is a designated initializer in c?

【讨论】:

    【解决方案2】:
    [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'    
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-10-06
        • 1970-01-01
        • 1970-01-01
        • 2018-04-14
        • 2014-09-01
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多