はじめまして。
早速ですが、質問させてください。
とあるプログラムのソースが、グローバル変数の定義と関数の定義を
それぞれまとめて、別々のファイルで行っていたのです。
たとえば、data.cとfunc.cというファイルがあったとして、
data.cというファイルの内容は
int a;
int b;
// data.cここまで
func.cというファイルには
extern int a;
extern int b;
void f1(void) { a = 1; }
void f2(void) { b = 2; }
// func.cここまで
といった具合です。
このようにグローバル変数をまとめて定義する意味って何かあるのでしょうか?
(リンカが低機能なのか…?)
推測でよいので何かしらご教示いただけたらありがたいです。
グローバル変数の定義箇所が意味不明
Re:グローバル変数の定義箇所が意味不明
グローバル変数は影響範囲が全体に及ぶため、扱いに注意が必要です。
なので、一箇所で全部管理してしまいたいという考えに至ったのかもしれません。
もしくは、グローバル変数は複数のファイルで使われることが前提としてあるはずなので、
func.c と hoge.c という複数のファイルで共有する変数を置く場所として data.c を用意したのかもしれません。
func.c でしか使わないグローバル変数をわざわざ別ファイルにしたというのであれば、不思議な話ですね。
それなら static int a; と書けばいいだけなので。
まあもしかしたら他のファイルでも使う予定があったのかもしれません。
なので、一箇所で全部管理してしまいたいという考えに至ったのかもしれません。
もしくは、グローバル変数は複数のファイルで使われることが前提としてあるはずなので、
func.c と hoge.c という複数のファイルで共有する変数を置く場所として data.c を用意したのかもしれません。
func.c でしか使わないグローバル変数をわざわざ別ファイルにしたというのであれば、不思議な話ですね。
それなら static int a; と書けばいいだけなので。
まあもしかしたら他のファイルでも使う予定があったのかもしれません。
Re:グローバル変数の定義箇所が意味不明
C言語ならあちこちで宣言してもひとつにまとめられる、ということを知らないのかもしれないですね。
逆にextern int a;しか宣言がなくてもリンク時にひとつだけint a;が宣言されたように扱われる、ということを知らない人も多い気がします。
int a;
と
extern int a;
は重ねて宣言しても不都合ないので
ヘッダファイルに
extern int a;
だけ書いておけばいいんですよね。
個人的にグローバル変数を使わないのでexternを最後に書いたのはいつだったか記憶にないですけど。
逆にextern int a;しか宣言がなくてもリンク時にひとつだけint a;が宣言されたように扱われる、ということを知らない人も多い気がします。
int a;
と
extern int a;
は重ねて宣言しても不都合ないので
ヘッダファイルに
extern int a;
だけ書いておけばいいんですよね。
個人的にグローバル変数を使わないのでexternを最後に書いたのはいつだったか記憶にないですけど。
Re:グローバル変数の定義箇所が意味不明
> グローバル変数は影響範囲が全体に及ぶため、扱いに注意が必要です。
> なので、一箇所で全部管理してしまいたいという考えに至ったのかもしれません。
グローバル変数の定義を一箇所に集中すると、グローバル変数がどこで使われているか
把握しづらくなるんですよね。
そんなワケで私は一箇所にまとめるメリットは無い、に一票です。
#モジュール設計を途中で投げ出しているコーディングのような気もする。。
> なので、一箇所で全部管理してしまいたいという考えに至ったのかもしれません。
グローバル変数の定義を一箇所に集中すると、グローバル変数がどこで使われているか
把握しづらくなるんですよね。
そんなワケで私は一箇所にまとめるメリットは無い、に一票です。
#モジュール設計を途中で投げ出しているコーディングのような気もする。。
レスありがとうございました
レスをいただいた皆様、ありがとうございました。
やっぱり意味、あるいはメリットはないみたいですね。
というか、あの状況できっちりしたソースを書くのは
曲芸(私には無理)のように感じました。
これ以上書くと愚痴が止まらなくなるので…この辺にしておきます。
皆様、ありがとうございました。
やっぱり意味、あるいはメリットはないみたいですね。
というか、あの状況できっちりしたソースを書くのは
曲芸(私には無理)のように感じました。
これ以上書くと愚痴が止まらなくなるので…この辺にしておきます。
皆様、ありがとうございました。