This question already has an answer here:
Closed last year.
Why doesn't compound literals assignment work without a typecast
(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