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
私の初期化順序が尊重されていないという警告がないという問題がありました。これに対して有効にできる警告または何かがありますか?
【実例】