【问题标题】:C11 Nested InitialisationC11 嵌套初始化
【发布时间】:2015-01-15 03:15:32
【问题描述】:

在 C11 中,有没有办法创建嵌套初始化来实现我在“test_successor_set”中概述的内容?

到目前为止,Google 搜索嵌套的 C11 初始化没有显示任何示例。

也许这是不可能的。

我已经做到了这一点,但我无法让它发挥作用。

typedef struct my_node_successor_struct {
   char *node_name;
   float cost;
} my_node_successor;

typedef struct my_node_successor_set_struct {
   const char *successor_name;
   my_node_successor *successors[];
} my_node_successor_set;

my_node_successor_set test_successor_set[] = {
 { .node_name = "S", .successors = { { .successor_name = "A", .cost = 2.f}, { .successor_name = "C", .cost = 3.f }, }},
 { .node_name = "A", .successors = { { .successor_name = "B", .cost = 1.f}, { .successor_name = "C", .cost = 1.f }, }},
 { .node_name = "C", .successors = { { .successor_name = "G", .cost = 3.f}, }},
 { .node_name = NULL, NULL },

};

【问题讨论】:

    标签: c c11


    【解决方案1】:

    没有。

    你有一个结构,它的末尾有一个灵活的数组成员(它可以出现的唯一位置)。但是您不能初始化此类结构的数组,也不能合法地创建此类结构的数组(因为数组的所有元素必须具有相同的大小,而 FAM 的要点是具有可变大小,并且在任何情况下,数组都不计入大小,因此 FAM 数组中只能有零个元素)。

    标准的相关部分,ISO/IEC 9899:2011 是

    §6.7.2.1 结构和联合说明符

    ¶3 结构或联合不应包含不完整或函数类型的成员(因此, 结构不应包含自身的实例,但可以包含指向实例的指针 本身),除了具有多个命名成员的结构的最后一个成员 可能有不完整的数组类型;这样的结构(以及任何包含,可能 递归地,作为这种结构的成员)不应是结构的成员或 数组的元素。

    ¶18 作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能 数组类型不完整;这称为灵活数组成员。在大多数情况下, 灵活的数组成员被忽略。特别是,结构的大小就像 省略了灵活的数组成员,除了它可能有更多的尾随填充 遗漏将意味着。但是,当.(或->)运算符具有左操作数时 (指向)具有灵活数组成员和正确操作数名称的结构 成员,它的行为就好像该成员被替换为最长的数组(具有相同的 元素类型)不会使结构大于被访问的对象;这 数组的偏移量应保持灵活数组成员的偏移量,即使这会有所不同 从替换阵列的那个。如果这个数组没有元素,它的行为就像 它有一个元素,但如果尝试访问该元素,则行为未定义 元素或生成一个越过它的指针。

    【讨论】:

      猜你喜欢
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 2016-08-08
      • 2021-10-16
      • 2018-11-06
      相关资源
      最近更新 更多