C 初始化静态常量数组

C 初始化静态常量数组,c,embedded,C,Embedded,我正在尝试初始化结构的静态常量数组: 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}, \

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

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}, \
};
我在编译过程中收到警告:

'注意:(接近'msg_id'和'warning:initializer[-Wmissing brates]周围缺少大括号'


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

如果你想学究式地使用大括号,那么它应该是正确的

static const ST_ID msg_ids[3] = 
{
    { { 0x8A, 0x01, 0x01 } },
    { { 0x8A, 0x02, 0x00 } },
    { { 0x8A, 0x03, 0x00 } },
};
这就是GCC希望您做的事情

然而,我希望您的原始变体也能生成正确的值(尽管带有恼人的GCC警告)


另外,为什么你坚持在初始化器中每行的末尾使用
\

如果你想学究式地使用大括号,那就应该这样做

static const ST_ID msg_ids[3] = 
{
    { { 0x8A, 0x01, 0x01 } },
    { { 0x8A, 0x02, 0x00 } },
    { { 0x8A, 0x03, 0x00 } },
};
这就是GCC希望您做的事情

然而,我希望您的原始变体也能生成正确的值(尽管带有恼人的GCC警告)


另外,为什么您坚持在初始化器内的每一行末尾使用该
\

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

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

初始化器会生成警告而不是错误,但是如果您以后向结构中添加了一个成员而不仅仅是数组,则严格遵循会使维护变得更简单。

您严格需要一对大括号来括住
结构
初始化器,一对大括号来括住数组成员初始化器;因此:

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

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

和运行时中的值不正确!!
…请。什么是
UINT8
?不要使用自制的固定宽度类型。请使用标准类型s。您不需要在每行末尾都使用“\`换行符-这不是宏。在最后一个初始化器后面还有多余的逗号。第一个警告完成了吗?它本身没有多大意义。GCC可以将诊断拆分为多行,某些IDE会过滤掉这些行-从原始编译器输出r中发布文本a比任何过滤的消息列表都要多。
和运行时中的值不正确!!
…请。什么是
UINT8
?不要使用自制的固定宽度类型。改用标准类型。您不需要在每行末尾都使用“\`newline转义符-这不是宏。在最后一个初始化器后面还有多余的逗号。I第一个警告完成了吗?它本身没有多大意义。GCC可以将诊断拆分为多行,某些IDE会过滤掉这些行—从原始编译器输出中发布文本,而不是任何过滤的消息列表。