使用指定的初始值设定项来初始化带有 `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 constant
在 Purchase
中使用成员 char *item;
时
(注意在任何时候只有一个版本的 item
是 struct
的一部分,另一个被注释)
因此,总而言之,如果不使用上面语句 /* 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"}};
我有以下嵌套 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 constant
在 Purchase
中使用成员 char *item;
时
(注意在任何时候只有一个版本的 item
是 struct
的一部分,另一个被注释)
因此,总而言之,如果不使用上面语句 /* 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"}};