【发布时间】:2018-01-25 13:17:01
【问题描述】:
考虑一下声明:
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(不同版本)。
【问题讨论】:
-
不是 100% 确定,但我认为您的第二个版本是复合文字 (en.cppreference.com/w/c/language/compound_literal),而第一个版本只是无效代码。
-
您会遇到语法错误,因为这是分配给结构的无效语法。初始化和赋值是两个非常不同的东西。
-
@SisterFister,第一种情况很好,没有任何错误。
-
@Someprogrammerdude,任何指向文档的指针?此外,问题是为什么第一种情况可以,而第二种情况则失败。在这两种情况下,左值都有定义的类型。
-
例如
{.a = x, .b = y}不是一个结构,它是一个初始化列表。另一方面,(struct some_struct){.a = x, .b = y}是一个结构,它是一个compound literal。更多信息请参见this C language reference,或read some good books。