ページ 11

グローバル変数の定義箇所が意味不明

Posted: 2010年7月08日(木) 01:48
by いくせ、ふたたび
はじめまして。

早速ですが、質問させてください。

とあるプログラムのソースが、グローバル変数の定義と関数の定義を
それぞれまとめて、別々のファイルで行っていたのです。

たとえば、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:グローバル変数の定義箇所が意味不明

Posted: 2010年7月08日(木) 04:29
by めるぽん
グローバル変数は影響範囲が全体に及ぶため、扱いに注意が必要です。
なので、一箇所で全部管理してしまいたいという考えに至ったのかもしれません。
もしくは、グローバル変数は複数のファイルで使われることが前提としてあるはずなので、
func.c と hoge.c という複数のファイルで共有する変数を置く場所として data.c を用意したのかもしれません。

func.c でしか使わないグローバル変数をわざわざ別ファイルにしたというのであれば、不思議な話ですね。
それなら static int a; と書けばいいだけなので。
まあもしかしたら他のファイルでも使う予定があったのかもしれません。

Re:グローバル変数の定義箇所が意味不明

Posted: 2010年7月08日(木) 18:16
by ISLe
C言語ならあちこちで宣言してもひとつにまとめられる、ということを知らないのかもしれないですね。
逆にextern int a;しか宣言がなくてもリンク時にひとつだけint a;が宣言されたように扱われる、ということを知らない人も多い気がします。

int a;

extern int a;
は重ねて宣言しても不都合ないので
ヘッダファイルに
extern int a;
だけ書いておけばいいんですよね。

個人的にグローバル変数を使わないのでexternを最後に書いたのはいつだったか記憶にないですけど。

Re:グローバル変数の定義箇所が意味不明

Posted: 2010年7月09日(金) 03:03
by Poco
> グローバル変数は影響範囲が全体に及ぶため、扱いに注意が必要です。
> なので、一箇所で全部管理してしまいたいという考えに至ったのかもしれません。

グローバル変数の定義を一箇所に集中すると、グローバル変数がどこで使われているか
把握しづらくなるんですよね。
そんなワケで私は一箇所にまとめるメリットは無い、に一票です。

#モジュール設計を途中で投げ出しているコーディングのような気もする。。

レスありがとうございました

Posted: 2010年7月09日(金) 21:55
by いくせ、たびたび
レスをいただいた皆様、ありがとうございました。

やっぱり意味、あるいはメリットはないみたいですね。

というか、あの状況できっちりしたソースを書くのは
曲芸(私には無理)のように感じました。

これ以上書くと愚痴が止まらなくなるので…この辺にしておきます。
皆様、ありがとうございました。