gcc拡張 構造体の初期化

仕事で見たコードでなんだこれ?と思ったコードがあった。調べてみるとgcc拡張を使ったコードだった。

#include<stdio.h>

typedef struct Hoge {
	int x;
	int y;
	int z;
} Hoge;

/* gcc拡張を使った初期化 */
Hoge hoge = {
	x: 1,
	y: 2,
	/* z: 3, */	/* 初期化なしのメンバは0で初期化される */
};

/* C99から取り込まれた書き方 */
Hoge fuga = {
	/* .x = 1, */	/* 初期化なしのメンバは0で初期化される */
	.y = 2,
	.z = 3,
};
int main(void)
{
	printf("x:%d, y:%d, z:%d\n", hoge.x, hoge.y, hoge.z);
	printf("x:%d, y:%d, z:%d\n", fuga.x, fuga.y, fuga.z);
	
 	return 0;
}

ポータビリティを考えれば、C99の書き方をする方がよいだろうが、どっちにしろ標準Cでは無い書き方。構造体のメンバが多い場合は可読性が高くなるだろうな。

C99の書き方はVBのWithステートメントっぽいな。