関数をどういう順番で定義するか
という話。から、書いていくうちに別の話になった<なんだそれ
ボクの場合は、まあ大体「重要そうな順番」というか「呼ばれる(頻度も含めて)順番」で定義することが多い、ような、気が、する。
簡単な例を示すと、
int HogeInit(void) { hoge = 0; return 0; } int HogeExit(void) { hoge = -1; return 0; } int HogeProc(void) { hoge++; return 0; } void HogeSet(int val) { hoge = val; } int HogeGet(void) { return hoge; }
のような感じ。って伝わるかな?
そして、ソース内ローカルスコープな関数はほぼ間違いなくソースの下の方で定義される。そして、大体こんな感なソースになる。
static void HogeInc(void); (略) int HogeProc(void) { HogeInc(); return 0; } (略) void HogeInc() { hoge++; }
何でこうしてるのかは、単に「ボクにとってその方が見やすいから」という以外に理由はない。
さて、さらにボクの場合、上のソースは以下のような感じになる。
int HogeInit(void); int HogeExit(void); int HogeProc(void); void HogeSet(int val); int HogeGet(void); static void HogeInc(void); int HogeInit(void) { hoge = 0; return 0; } int HogeExit(void) { hoge = -1; return 0; } int HogeProc(void) { HogeInc(); return 0; } void HogeSet(int val) { hoge = val; } int HogeGet(void) { return hoge; } void HogeInc() { hoge++; }
ボクのゲームとかで C で組まれたやつのソースコードを見た人は「あー」と思われるかもしれません。
まあ確かに無駄な記述だと思う(extern なプロトタイプ宣言はヘッダに書けば良いじゃない)のだけど。
特に深い意味とか理由はないんだけど、主に「ヘッダファイルよりソース見る事が多い」のが理由かな?ソースが公開されてるライブラリとかだったら、ヘッダファイル調べるよりソースコードをまず見るし。あとはまあ、せいぜい、ボクが書いたヘッダファイルはソースコードからコピペして編集したものなので、「ヘッダ見るよりはソース見た方が早い」というのもあるかも。
でも、この辺は言語文化の違いもあるかも。よくわかってないで書くけど、C++ とかだったら「まずヘッダファイル(の中のクラス定義)ありき」という感じかもしれないし。
実はそんなことより、ボク自身は「ヘッダファイル(というかプリプロセッサ)はちょっとねー」という論調の人間だったりするのです。それが一番でかい理由かも。