【问题标题】:Statically initialize array within structure静态初始化结构内的数组
【发布时间】:2014-10-07 02:56:34
【问题描述】:

不代表其他编译器,但在 GNU GCC 编译器中,您可以使用以下语法静态初始化数组:

struct some_struct {
        unsigned *some_array;
} some_var = {
        .some_array = (unsigned[]) { 1u, 2u, 3u, 4u, 5u, },
};

首先,我遇到了这种语法来寻找我关心的问题的答案,然后来到this 答案。但我还没有找到任何涵盖这种语法的 GNU 参考链接。

如果有人与我分享此语法的链接,我将不胜感激。谢谢!

【问题讨论】:

  • 它是一个复合字面量,在 C99 中引入,[more info]
  • @mesmerizingsnow:“静态初始化”中的“静态”到底是什么意思?
  • @AndreyT 直到我在这里得到了一些答案(包括你的),我才确定。

标签: c arrays gcc initialization gnu


【解决方案1】:

好吧,如果您的问题是关于 compound literal 语法,那么这里的一个重要细节是您没有在结构中初始化 array。您正在初始化结构中的 指针。您现在拥有的代码在形式上是正确的。

如果你的结构中真的有一个 array,那么这种使用复合字面量的初始化是行不通的。您不能从另一个数组初始化一个数组。数组不可复制(char 数组从字符串初始化除外)。但是,在这种情况下,您可以使用普通的 {}-enclosed 初始化程序,而不是复合文字。

还请记住,复合文字 (unsigned[]) { 1u, 2u, 3u, 4u, 5u, } 的生命周期取决于它出现的范围。如果您在本地范围内执行上述操作,复合文字数组将在块的末尾被销毁。指针值(如果您设法将其移出该块)将变为无效。

【讨论】:

    【解决方案2】:

    您可能不会找到很多关于此的 GNU 文档,因为它不是 GCC 扩展 - 这是标准 C 语法的一部分,称为 复合文字。它在C standard 的第 6.5.2.5 和 6.7.9 节中定义(后者涵盖了大括号之间的部分,这对于复合文字和静态初始化器都是相同的,因此标准只描述了一次)。

    您也可以使用此语法来描述动态对象值,而不仅仅是静态初始化,甚至在没有分配给任何变量的情况下单独存在于表达式中。复合文字基本上可以出现在变量名可以出现的任何地方:你可以将它们传递给函数,创建它们只是为了访问一个元素,获取它们的地址(你甚至可以将它们分配 to ,尽管这并不明显这有什么用)。

    语法在所有 C 值类型中都是统一的,可用于创建数组(使用 [N]= 指定要设置的特定元素)、结构和联合(使用 .field= 指定特定元素)甚至数字类型(没有元素,所以不要指定,只需将值放在大括号之间)。该语法旨在使宏和代码生成器生成的语法简单且一致(除了可以优雅地手动编写之外)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-31
      • 2013-09-22
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 2011-02-08
      • 2023-04-05
      • 2013-09-10
      相关资源
      最近更新 更多