使用指定的初始值设定项来初始化带有 `char []` 成员的嵌套结构

Using a designated initializer to initialize nested struct with a `char []` member

我有以下嵌套 struct 定义:

typedef struct {
    int count;
    float cash;
    char item[50];//switch between array and pointer for testing initializers
    //char *item;
}Purchase;

typedef struct {
    int accnt;
    char acct_name[50];
    Purchase purch;
} Acct;

对于 Purchase struct 本身,以下初始化程序有效:

//Uses member names:
/* 1 */Purchase p = {.count = 4, .cash = 12.56, .item = "thing"};
//  Note: this member:                          ^^^^^^^^^^^^^^^

对于嵌套结构Acct,以下工作:

// No member names:
/* 2 */Acct acct = {100123, "Robert Baily", {15, 12.50, "Tires"}};
//                                                      ^^^^^^^

但是当我尝试使用成员名称时,如第一个示例所示:

// Attempts to use member name, but fails the last one:
/* 3 */Acct acct3 = {.accnt = 100123, .acct_name = "Robert Baily", {acct3.purch.count = 15, acct3.purch.cash = 12.50, acct3.purch.item = "Tires"}};
// error occurs here ->                                                                                                                ^

我收到这个错误:22, 131 error: array type 'char [50]' is not assignable 使用会员时 char item[50]; in购买`

我得到这个错误:22, 14 error: initializer element is not a compile-time constantPurchase 中使用成员 char *item; 时 (注意在任何时候只有一个版本的 itemstruct 的一部分,另一个被注释)

因此,总而言之,如果不使用上面语句 /* 2 */ 中的命名赋值语句,我可以初始化一个嵌套结构,但是当我尝试使用 char [] 类型所示的命名赋值时在语句 /* 3 */ 中,它失败了。

char []char * 是嵌套结构构造的内部结构的成员时,我缺少什么?

我正在使用 CLANG 设置为 C99

结构 Acct 和结构 Purchase 都没有数据成员名称 acct3。所以变量 Acct acct3

的初始值设定项列表
{acct3.purch.count = 15, acct3.purch.cash = 12.50, acct3.purch.item = "Tires"}

无效。

考虑到错误消息,编译器认为这样的初始化列表的一部分

acct3.purch.item = "Tires"

作为对象 acct3 的数据成员项的赋值,数组没有赋值运算符,因为它们是不可修改的左值。

您正在尝试编译:

Acct acct3 = {.accnt = 100123, .acct_name = "Robert Baily", 
           {acct3.purch.count = 15, acct3.purch.cash = 12.50, acct3.purch.item = "Tires"}};

此初始值设定项无效,因为 acct3.purch 不是 Purchase 的字段名称。初始化时只使用最里面的字段名。

Acct acct3 = {.accnt = 100123, .acct_name = "Robert Baily", 
              .purch = {.count = 15, .cash = 12.50, .item = "Tires"}};