C のソースの変なかきかた

C++ のほうがテンプレート活用で変なかきかたできるんでしょうけど、私には C++ は難しくて使えません.

タグを活用する

タグは struct/enum/union につけられる名前で、変数や関数名と名前空間が別です. とはいえ struct だけが利用される傾向にあり、いつのまにか typedef を利用して struct を書かなくてもいいようになっているのがよくある例です. ここでは typedef は使いません.

タグ名と変数名を同じにする

struct header{
	int xx;
	....
}header;

先述の通り名前空間が別なのでエラーになりません. typedef ではエラーになります.

struct の宣言の前に変数の属性をつける

static const struct header{
	int xx;
	....
}header[] = {
	{...},
	{...}
};

struct の中身宣言のあとに変数名だけをつけるので,最初に属性をつけるらしいです.

struct の中身宣言と一緒に関数を実装する

struct header{
	int xx;
	....
}*func(void){
	static struct header hoge;
	return &hoge;
}

変数が宣言できるなら関数も実装できます. 意外なことに struct の隠蔽化でわりと実用的です. 関数の中身ですが、 struct の変数属性に static をつけ忘れると Warning がでますし、実際にそのまま動かすと使い物になりません.

これの派生として enum でも似たようなことができます.

enum hoge{
	HOGE_HOGE, ....
}hoge(void){
	return HOGE_HOGE;
}

enum の場合はヘッダに中身を書く場合もあるので enum の中身の宣言とその戻り値を持つ関数の宣言なんかに使えてしまいます.

関数プロトタイプを複数宣言する

static enum hoge{
	HOGE_HOGE, ....
}hoge_add(int), hoge_sub(int), hoge_shift(int);

個人的には static 関数のプロトタイプは書かないようにソースの上のほうに書いておくのですが、関数ポインタで切り替える場合はプロトタイプ宣言は必要です. そのような場合に戻り値の型が同じ関数は , で区切って複数宣言可能です.

可能ですが引数は都度書くことになるので、関数ポインタの型を typedef して複数宣言するほうが便利です.

その他関係ないこと

最近は私は集中力が続かないので C を書くこともこれぐらいが限界になっております...