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
,然后a
再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
问题是没有警告我的初始化顺序没有得到遵守.是否有警告或我能为此启用的内容?
[ 实例 ]
你可以在C中做的最好的(读取:合理的)是在初始化struct之前声明三个临时的const变量.他们的声明顺序是他们的初始化者的评估顺序.
像这样的东西:
const char a = f(); const float b = g(); const int c = h(); X foo = {.a = a, .b = b, .c = c};
在这种情况下,函数调用的顺序和程序员的意图是清楚的.