【问题标题】:Initializing structure by named members通过命名成员初始化结构
【发布时间】:2011-07-15 15:00:31
【问题描述】:

我正试图围绕http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage%2Fref%2Fclrc03strin.htm 中提供的语法:

struct
{
    int a[5], b;
} game[] =
{
    [0].a = { 1 },
    [1].a[0] = 2
};

理想情况下,我会找到一些方法来执行以下操作:

struct
{
    int a, b;
} foo =
{
    .a = 4,
    .b = 5
};

我想要对结构进行按名称初始化的原因是我自己的结构有很多成员,所以我想要更好的清晰度。我不应该只在单独的语句中初始化它们,因为这是一个对性能敏感的嵌入式应用程序,其中成员实际上是位域,因此单个 struct init 生成的指令比多个成员初始化少。

哪个 C 标准允许这样的按名称成员初始化?

【问题讨论】:

    标签: c data-structures struct initialization


    【解决方案1】:

    目前还不清楚你在问什么,但是使用 c99 编译器,你的第一次尝试可以写成

    struct
    {
        int a[5], b;
    } game[] =
    {
        [0] = {.a = { 1 }},
        [1] = {.a[0] = 2}
    
    };
    

    【讨论】:

      【解决方案2】:

      我在 C99 下的嵌入式应用程序中做类似的事情。我有一个名为 phaseInstill 的变量,它被“分配”给一个结构:

          phaseInstill = (PhaseVolumeStatus)
          {
              .complete = false,
              .ticksInstilled = 0,
              .volumeInstilled = 0,
              .volumeRemaining = instillVolume
          };
      

      PhaseVolumeStatus 定义为:

      typedef struct
      {
          Value volumeRemaining;              /*!> ml */  
          Value volumeInstilled;              /*!> ml */
          Value ticksInstilled;               /*!> ticks */
      
          bool complete;
      } PhaseVolumeStatus;
      

      我没有方便的位域示例,但我不记得它在我的任何其他用途中的工作方式有什么不同。

      【讨论】:

      • 我怀疑是 C99,遗憾的是,HiTech 和 C18 似乎都不支持这种语法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 2015-02-19
      相关资源
      最近更新 更多