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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
いくせ、ふたたび

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

#1

投稿記事 by いくせ、ふたたび » 15年前

はじめまして。

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

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

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

#2

投稿記事 by めるぽん » 15年前

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

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

ISLe

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

#3

投稿記事 by ISLe » 15年前

C言語ならあちこちで宣言してもひとつにまとめられる、ということを知らないのかもしれないですね。
逆にextern int a;しか宣言がなくてもリンク時にひとつだけint a;が宣言されたように扱われる、ということを知らない人も多い気がします。

int a;

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

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

Poco

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

#4

投稿記事 by Poco » 15年前

> グローバル変数は影響範囲が全体に及ぶため、扱いに注意が必要です。
> なので、一箇所で全部管理してしまいたいという考えに至ったのかもしれません。

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

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

いくせ、たびたび

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

#5

投稿記事 by いくせ、たびたび » 15年前

レスをいただいた皆様、ありがとうございました。

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る