[86] Re:GLOBAL
投稿者:(ぱ)
2007/02/20 02:13:25
>手間と言えば手間なんですが、グローバル変数にするような
>ものは、必ず初期化する趣味なので、GLOBAL みたいな簡単な
>マクロでは対処できなかったりします (たとえ 0 や NULL で
>初期化する場合でも、明示的に初期化するスタイルを採って
>ます)。
GLOBAL char *hoge[]
#ifdef GLOBAL_VARIABLE_DEFINE
= {
"foo",
"bar",
}
#endif /* GLOBAL_VARIABLE_DEFINE */
;
とか書いたこともありますけどね (^^;
>また、そもそもグローバル変数なんてほとんど使わないので、
>手間的にはたいしたことないです。
別レスで書きましたけど、実は私もそうです。
別レスで挙げたCLC_Interpreterのように、構造体にまとめて
malloc()で領域を確保することが多いです。
# わかりにくいですがCLC_Interpreterはポインタでして、
# こういうふうにポインタがポインタでないかのようにtypedefするのは
# よろしくないなあ、と今は思っています。当時はXtとかのスタイルを見て
# かっこいいと思ってしまったわけですが。
## clc_current_interpreterのようなものを静的に持ってしまうと
## リエントラントでなくなります。当時はマルチスレッドなんて
## そうそう使わないよね、と思ってたわけですが…
## まあ、リエントラントにしたい場合も、外部のインタフェースにだけは影響を
## 与えないようにしてあるからまあ許容範囲かと。
>昔風のプログラムなら
>グローバル変数にする場合も、たいていは accessor/mutator
>関数でラップして見かけは関数にしてしまうことがほとんど
>です。
たとえばclc_current_interpreterは関数でラップされていませんが、
CLCモジュールの外から見えることもありません。
これはモジュールの粒度をどのくらいにするかという問題だと思いますが、
「関連の強いソースの集合体としてのモジュール」内(せいぜい数千行レベル)で
あれば、この程度のカプセル化の侵食は許容範囲じゃないかなあ、
と私は思っています。
もちろん最初からgetter/setterを書いたからといってさしたる手間でも
ないですけれど。