【问题标题】:Initializing a static const array初始化静态常量数组
【发布时间】:2016-10-28 13:07:49
【问题描述】:

我正在尝试初始化结构的静态 const 数组:

typedef struct{
UINT8 id_array[3];
} __attribute__((packed, aligned(1))) ST_ID;

我按如下方式进行初始化:

static const ST_ID msg_ids[3] = 
{
    /* Category A: Protocols */
    {0x8A,      0x01,   0x01}, \
    {0x8A,      0x02,   0x00}, \
    {0x8A,      0x03,   0x00}, \
};

我在编译过程中收到警告:

'note: ('msg_ids' 和'warning: 在初始化器 [-Wmissing-braces] 周围缺少大括号'的初始化附近'

而且运行时的值不正确!!

【问题讨论】:

  • and the values in run time are not correct!!...minimal reproducible example 请。
  • 什么是UINT8?不要使用自制的固定宽度类型。请改用标准类型。
  • 您不需要在每一行的末尾使用 `\` 换行符 - 这不是宏。
  • 最后一个初始化器后面还有一个多余的逗号。
  • 第一个警告是否完整?它本身没有多大意义。 GCC 可以将诊断信息拆分到一些 IDE 过滤掉的多行中 - 从原始编译器输出中发布文本,而不是任何过滤后的消息列表。

标签: c embedded


【解决方案1】:

如果你想在牙套上学究气,那应该是

static const ST_ID msg_ids[3] = 
{
    { { 0x8A, 0x01, 0x01 } },
    { { 0x8A, 0x02, 0x00 } },
    { { 0x8A, 0x03, 0x00 } },
};

这是 GCC 期望你做的。

但是,我希望您的原始变体也能产生正确的值(尽管带有烦人的 GCC 警告)。

附:为什么你坚持在初始化器内每一行的末尾使用\

【讨论】:

    【解决方案2】:

    您严格需要一对大括号来包围struct 初始化器和一对来包围数组成员初始化器;因此:

    static const ST_ID msg_ids[3] = 
    {
        { { 0x8A, 0x01, 0x01 } },
        { { 0x8A, 0x02, 0x00 } },
        { { 0x8A, 0x03, 0x00 } }
    } ;
    

    您的初始化程序会生成警告而不是错误,但如果您稍后将成员添加到结构中而不仅仅是数组,那么严格遵守会使维护变得更简单。

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 2015-02-18
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      相关资源
      最近更新 更多