【问题标题】:Quickest way to initialize an array of structures to all-0's?将结构数组初始化为全 0 的最快方法?
【发布时间】:2011-07-23 00:50:19
【问题描述】:

我正在尝试使用以下语法将结构数组初始化为全 0:

STRUCTA array[MAX] = {0};

但是,我从 gcc 收到以下警告:

警告:初始化器周围缺少大括号

我做错了什么 - 还有其他/更好的方法吗?

【问题讨论】:

  • 这对您有帮助吗? stackoverflow.com/questions/201101/…(见第二个答案)
  • @RedX - STRUCTA 是一个随机的例子......任何结构都会抛出这个 - 我无法透露确切的结构,因为它是公司代码 :)

标签: c initialization structure


【解决方案1】:

数组是用大括号初始化的,但结构体也是如此。您可能需要在 0 周围放置一组额外的大括号,并且根据 STRUCTA 的定义方式,一些额外的 0 用逗号分隔。

【讨论】:

    【解决方案2】:

    gcc 令人讨厌。它应该在没有警告的情况下接受这一点。
    试试这个

    STRUCTA array[MAX] = {{0}};
    

    可以使用选项-Wmissing-braces 或-Wno-missing-braces 控制gcc 行为。

    -Wall 启用此警告;要拥有-Wall 而不是缺少的大括号,请使用-Wall -Wno-missing-braces

    【讨论】:

      【解决方案3】:

      STRUCTA 可以赋值为 0 吗?

      你也可以随时使用 memset()。

      【讨论】:

      • 参见上面的 Rumple Stiltskin 示例。这就是我试图沟通的内容。如果 STRUCTA 不能直接分配给 {0},则 gcc 不会让您这样做。不过,memset 会盲目地这样做。
      • 首先不是赋值,是初始化。其次,C语言中的any结构体(或数组)可以用{ 0 }初始化。
      • ... 类似于 mystruct x { int a;诠释 b; } 可以初始化为 {0} 吗?我认为,您至少需要 {{0, 0}}
      • @AndreyT:不仅仅是结构和数组。 C 中的任何类型都可以用{0} 进行初始化。 int x = {0}; 是有效的 C。
      【解决方案4】:

      这取决于结构。例如:

      typedef struct structa 
      {
          int a, b;
      } STRUCTA;
      
      int main (int argc, char const* argv[])
      {
          STRUCTA array[10] = {{0,0}};
          return 0;
      }
      

      【讨论】:

        【解决方案5】:

        如果结构的第一个成员具有标量类型,请使用

        STRUCTA array[MAX] = {{ 0 }};
        

        如果您的结构的第一个成员恰好是另一个结构对象,其第一个成员具有标量类型,那么您将不得不使用

        STRUCTA array[MAX] = {{{ 0 }}};
        

        等等。基本上,每次“输入”另一个嵌套聚合(结构或数组)时,都必须打开一个新级别的嵌套{}。所以在这种情况下,只要每个嵌套聚合的 first 成员也是一个聚合,就需要更深入地使用{}。

        所有这些额外的大括号只是为了避免警告。当然,这只是一个无害的警告(在这种特定情况下)。您可以使用简单的{ 0 },它会起作用。

        处理此问题的最佳方法可能是完全禁用此警告(有关正确的命令行选项,请参阅@pmg 的答案)。从事 GCC 工作的人并没有想清楚。我的意思是,我理解该警告的价值(它确实非常有用),但破坏{ 0 } 的功能是不可接受的。 { 0 }应该被特殊对待。

        【讨论】:

        • 无法禁用警告....公司政策,我不得不说它会产生更清晰的代码!!
        • @shan23:我想说最干净的代码是{ 0 },它是 C 中的通用零初始化器。你们公司的政策是破坏 C 语言中最干净的习惯用法之一(而且是一个非常有用的)。
        • +1 我基本同意,我想说问题不是公司政策而是 gcc 政策。 -Wno-braces 实际上也禁用了其他可能有用的大括号相关的警告(如if if else 的东西),gcc 完全错误和愚蠢地不考虑通用零初始化器在这方面的特殊性。
        【解决方案6】:

        这只是 gcc 发出的有害警告,我会用-Wno-braces 禁用它。 {0} 是一个非常有用的“通用零初始值设定项”,适用于您的代码不应该知道其定义的类型,并且 gcc 不鼓励使用它对追求好的代码是有害的。

        如果 gcc 想要保留这个警告,它至少应该特例 {0} 并在这种情况下禁用警告。

        【讨论】:

          【解决方案7】:

          您可以通过使用完全空的大括号来避免警告:

          STRUCTA 数组[10] = {};

          数组将为aggregate-initialized,这意味着其中的每个结构都将依次为value-initialized。带空括号的值初始化变成每个结构的aggregate-initializion,这会将所有字段设置为0,这就是你想要的。

          只要您的结构是 POD,这在所有情况下都有效(有关详细说明,请参阅上面的链接)。

          【讨论】:

            猜你喜欢
            • 2012-06-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多