This question already has an answer here:
Closed last year.
Why doesn't compound literals assignment work without a typecast
(1个答案)
考虑一下声明:
虽然在
以下内容解决了此问题:
或
编译器是Linux上的GCC(不同版本)。
由于您正在创建一个对象,
然后在运行时将复合文本分配给数组项,这非常好。
(1个答案)
考虑一下声明:
struct my_cool_struc {
int field_x;
int field_Y;
int field_z;
};
#define MY_COOL_MACRO(x,y,z) \
{ \
.field_x = (x), \
.field_y = (y), \
.field_z = (z), \
}
static const struct my_cool_struc why[] = {
MY_COOL_MACRO(1,2,3),
MY_COOL_MACRO(6,5,4),
MY_COOL_MACRO(7,8,9),
{}
};
static int my_cool_func(...)
{
struct my_cool_struc p[10];
int a1, a2, a3;
unsigned int index = 0;
...
p[index++] = MY_COOL_MACRO(a1, a2, a3);
...
return 0;
}
虽然在
why
赋值中一切正常,但编译器无法构建函数,语法分析器失败。以下内容解决了此问题:
- { \
+ (struct my_cool_struc) { \
或
- p[index++] = MY_COOL_MACRO(a1, a2, a3);
+ p[index++] = (struct my_cool_struc)MY_COOL_MACRO(a1, a2, a3);
编译器是Linux上的GCC(不同版本)。
最佳答案
MY_COOL_MACRO
在声明中使用时,使用指定的初始化器,这是初始化过程中仅存在的特性。它们不能在分配期间使用。
之所以(struct my_cool_struc)MY_COOL_MACRO
在赋值期间修复了该问题,是因为它根本不是强制转换。相反,它正在创建一个名为compound literal的临时未命名对象:
(struct my_cool_struc){ .field_x = (x), .field_y = (y), .field_z = (z) }
由于您正在创建一个对象,
{ }
之间的部分是一个初始值设定项列表,您可以在其中使用指定的初始值设定项。然后在运行时将复合文本分配给数组项,这非常好。
09-04 21:26