anonymous structure

例えば,abacoにはこんなコードが出てくる.

	r.min.y = c->tag.r.max.y+Border;

何の変哲もないコードだけど,gccコンパイルすると,tagにはrというメンバがないとエラーになる.tagの型はstruct Textなんだけど,最初のメンバは型名だけで変数名がない.

struct Text
{
	Frame;
	uint		org;
	uint		q0;
	uint		q1;
		:
};

このようにある構造体内に名前のない構造体を宣言できるのがanonymous structureである.この場合,外側の構造体から内側の構造体のメンバ変数に対して,プレフィックスなしでアクセスできる.つまり,最初のメンバ変数名を仮にfとすると,tag.f.rをtag.rと書けるのだ.

また,winlock関数などから呼ばれているincref関数やqlock関数は,それぞれRef *とQLock *を引数に持つのに,Window *型の変数wをキャスト無しに渡している.

struct Window
{
	Ref;
	QLock;
	Text		tag;
		:
};

void
winlock(Window *w, int owner)
{
	incref(w);
	qlock(w);
	w->owner = owner;
}

この場合,関数宣言された引数の型に応じて実際に渡すアドレスをコンパイラが解釈しているのである.

anonymous structureの実装がどうなっているのか興味があれば,Russ Cox氏のShow and Tellのスライドが参考になる.

これ以外にも,関数定義で引数の変数を省略できたりとか...

void
execute(Text *t, uint aq0, uint aq1, Text *)
{