C99 为结构引入了指定初始化器的概念。例如,给定:
typedef struct {
int c;
char a;
float b;
} X;
我可以像这样初始化:X foo = {.a = '\1', .b = 2.0F, .c = 4};
并且调用:printf("c = %d\na = %hhu\nb = %f", foo.c, foo.a, foo.b);
会输出:
c = 4
a = 1
b = 2.000000
正如这里提到的,这具有分配给c
then a
then的“令人惊讶的行为”,b
与我指定的初始化程序的顺序无关。
如果我有这样的功能,这将成为一个真正的问题:
int i = 0;
int f() {
return ++i;
}
int g() {
i += 2;
return i;
}
int h() {
i += 4;
return i;
}
我想像这样初始化:X foo = {.a = (char)f(), .b = g(), .c = h()};
现在当我这样做时:printf("c = %d\na = %hhu\nb = %f", foo.c, foo.a, foo.b);
我得到:
c = 4
a = 5
b = 7.000000
问题是没有警告我的初始化顺序没有得到遵守。是否有警告或我可以为此启用的东西?
[现场示例]