【问题标题】:How do subobjects work in C?子对象如何在 C 中工作?
【发布时间】:2017-02-20 03:19:45
【问题描述】:

自定义类型的 C 数组中的独立方括号是什么意思?

typedef enum {
    BAR_1 = 0,
    BAR_2,
    BAR_3,
} bar_types;

typedef struct {
    int is_interesting;
    int age;
} foo_s;

static foo_s bars[] = {
    [BAR_1] = {1, 2},  /* What is being done here? */
    [BAR_2] = {1, 41},
    [BAR_3] = {0, 33},
};

上面代码中[BAR_1] = {1, 2}是什么意思?什么时候可以使用独立的方括号?

我注意到,如果我在括号中添加重复值,clang 会发出有关子对象初始化的警告。

static foo_s bars[] = {
    [BAR_1] = {1, 2},
    [BAR_2] = {1, 41},
    [BAR_3] = {0, 33},
    [BAR_3] = {0, 33},
};

-----

$clang example.c
example.c:17:19: warning: subobject initialization 
  overrides initialization of other fields within its
  enclosing subobject [-Winitializer-overrides]
    [BAR_3] = {0, 33},
              ^~~~~~~

什么是 C 子对象?

【问题讨论】:

  • 那些只是指定要初始化的特定数组元素。枚举值的作用类似于对应的int 值,因此[BAR_1] = {1, 2} 变为[0] = {1, 2},这意味着数组中的第一个结构(索引0)被初始化为is_interesting 为1,age 为2。
  • “子对象”是包含在另一个对象中的任何对象。
  • 符号是“指定初始化器”的一种。
  • @racraman 这是一个 C++ 问题。这是关于 C 的。

标签: c arrays clang subobject


【解决方案1】:

这是结构初始化,“子对象”是正在初始化的结构的实例。

您的警告来自尝试两次初始化相同的数组位置。

另见How to initialize a struct in accordance with C programming language standards

【讨论】:

  • 警告,不是错误。初始化两次有效。
  • 当然,警告不应该被忽略:-Wno-initializer-overrides。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多