Tag: 指定初始化器

使用带有未命名嵌套数据类型的指定初始值设定项

我想知道是否有可能在未命名的结构数据成员中使用指定的初始化器…(Yikes,一口,但是,是的,这是我做的事情最干净的方式……)。 如果我有: typedef struct MainStruct { union { uint8_t a8[16]; uint64_t a64[2]; }; uint64_t i64; } MainStruct_t; typedef struct OtherStruct { MainStruct_t main; int otherval; } OtherStruct_t; OtherStruct_t instance = { .main.a64 = { 0, 0 }, .otherval = 3 }; 我尝试编译,我得到错误: tst3.c:16: error: unknown field ‘a64’ specified in initializer 我也尝试过使用.main..a64 ,但我遇到了其他问题。 这是使用gcc 4.4。 不幸的是, […]

C99指定的初始化程序重复索引在构建输出或lint中根本没有标记

前几天我在指定的初始化程序中玩了一下,我惊讶地发现,多次使用相同的索引是有效的。 更重要的是,当我这样做时,它甚至没有产生编译器警告,错误甚至信息声明,甚至PC-Lint似乎也不关心(我认为最让我感到惊讶)。 我想知道编译器是否有理由在这种情况下甚至没有提供信息消息,或者是否有其他编译器/ lint /等。 可用于捕获或标记此选项的选项。 使用的工具:Renesas RX标准工具链v1.2.0.0(C99),gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5.1)(在VM中),Lint-NT 9.00i 例如,我正在处理的一些旧代码#defines一堆命令,然后创建一个命令结构数组(这里大大简化),循环查找并使用该特定命令: #define CMD_RMEM 0 #define CMD_WMEM 1 #define CMD_XCRC 2 #define CMD_NULL 3 typedef struct { const char cmdID; const char* cmdStr; } CMD; const CMD commands[] = { {CMD_RMEM,”RMEM”}, {CMD_WMEM,”WMEM”}, {CMD_XCRC,”XCRC”}, {CMD_NULL,”NULL”}, }; 然后我想起了我在某处看到的指定初始化语法,并认为除了检测重复的命令索引之外,它还可以为数组中项目的排列提供更大的灵活性,例如: //(same #def’s & typedef as above) const CMD commands[] = […]

C99结构指定的初始化程序和其他值

我知道在C99中你可以使用成员名称初始化结构的成员,如下所示: struct myStruct { int i; char c; float f; }; 以下是有效的: struct myStruct m = {.f = 10.11, .i = 5, .c = ‘a’}; 还有人说未初始化的成员将被设置为0 。 所以 struct myStruct m = {.f = 10.11, .c = ‘a’}; 在这里i将被设置为0 但是,对于以下内容: struct myStruct m = {.f = 10.11, .c = ‘a’, 6}; i仍然初始化为0.如果我们进行这样的复合初始化是什么原因。

对于未由指定初始化程序命名的字段会发生什么?

在C99(而不是C ++)中,可以使用以下语法初始化结构: struct info { char name[8+1]; int sz; int typ; }; struct info arr[] = { [0] = { .sz = 20, .name = “abc” }, [9] = { .sz = -1, .name = “” } }; 未指定的字段会发生什么?