掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28008

グローバル変数の宣言と定義とexternおよび記述場所について
投稿者---miya(2006/08/31 17:00:45)


はじめて投稿します。よろしくお願いします。

まず、前提というか私の解釈を確認させてください。
・グローバル変数は宣言=定義である。
・ただしexternをつけると宣言のみを意味するようになる。
・同じ変数の宣言は何度でも可能だが定義は一度だけでなければならない。
・(静的でない)グローバル変数のスコープは全ファイルである。
・一般にグローバル変数はヘッダファイルに記述する。
上記が正しいとして、質問させて頂きます。
下記3つのファイルがあります。
ソースファイルaaa.c
ヘッダファイルaaa.h
ソースファイルbbb.c
aaa.hはaaa.cとbbb.cにインクルードされています。また、aaa.hではグローバル変数が下記のように記述されています。
#if defined(aaa_c)
    #define EXTERN
#else
    #define EXTERN   extern
#endif

EXTERN  型名  グローバル変数名

aaa.cではaaa_cを、bbb.cではbbb_cをそれぞれ#defineで空定義しています。

これは、aaa.hをaaa.cでインクルードした時はグローバル変数を定義し、bbb.cでインクルードした時は定義ではなく宣言となることを意図してこれらの記述をしているという理解で正しいでしょうか?

また、このような処理を行うならば、そもそもグローバル変数のスコープは全ファイルなので、aaa.hではなくaaa.cで宣言してしまえばよいのではないでしょうか?全ファイルで使用できるグローバル変数をヘッダファイルに記述して、その変数を使用するソースファイルでインクルードする意図は何なのでしょうか?

長くなってしまいましたが、よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:グローバル変数の宣言と定義とexternおよび記述場所について 28009 nano 2006/08/31 17:31:48
<子記事> Re:グローバル変数の宣言と定義とexternおよび記述場所について 28010 chu- 2006/08/31 17:46:49
<子記事> Re:グローバル変数の宣言と定義とexternおよび記述場所について 28011 miya 2006/08/31 18:44:14


No.28009

Re:グローバル変数の宣言と定義とexternおよび記述場所について
投稿者---nano(2006/08/31 17:31:48)


何かの都合でグローバル変数の内容が変わったとき、
それをインクルードしているヘッダーファイルを
修正すればすむ、ということがあると思います。


この投稿にコメントする

削除パスワード

No.28010

Re:グローバル変数の宣言と定義とexternおよび記述場所について
投稿者---chu-(2006/08/31 17:46:49)


> という理解で正しいでしょうか?

正しいでしょう。

> 意図は何なのでしょうか?

変更漏れなどのミスの可能性を減らしつつ、なおかつ楽をするためです。

プロジェクトに[aaa.c]、[bbb.c]、[ccc.c]の3つのソースファイルがあるとして、
aaa.cで使っているaaa_var変数をbbb.cとccc.cから参照する場合を考えてみます。
下記に3つの版を書いてみました。

ここで、例えばaaa_var変数の型をcharからlongへ変更する必要ができたとします。
どの版が一番変更が楽でしょうか。

----------------------------------------
<何も無し版>
[aaa.c]
char aaa_var;

[bbb.c]
extern char aaa_var;

[ccc.c]
extern char aaa_var;

----------------------------------------
<ヘッダ活用版>
[aaa.h]
extern char aaa_var;

[aaa.c]
#include "aaa.h"

char aaa_var;

[bbb.c]
#include "aaa.h"

[ccc.c]
#include "aaa.h"

----------------------------------------
<ヘッダ+マクロ活用版>
[aaa.h]
#if defined(aaa_c)
    #define EXTERN
#else
    #define EXTERN   extern
#endif

EXTERN char aaa_var;

[aaa.c]
#define aaa_c
#include "aaa.h"

[bbb.c]
#include "aaa.h"

[ccc.c]
#include "aaa.h"

----------------------------------------



この投稿にコメントする

削除パスワード

No.28011

Re:グローバル変数の宣言と定義とexternおよび記述場所について
投稿者---miya(2006/08/31 18:44:14)


nanoさん、chuさんご回答ありがとうございます。
なるほど、たしかに修正する場合はヘッダ+マクロ活用版が一番楽ですね。

ところで、何も無し版でbbb.cとccc.cでは
extern char aaa_var;
がありますが、グローバル変数を使用するだけならば不要ですよね?
このファイルではaaa_varを使用していますよ、という事を明示する
ためでしょうか?



この投稿にコメントする

削除パスワード

No.28012

Re:グローバル変数の宣言と定義とexternおよび記述場所について
投稿者---iijima(2006/08/31 19:13:25)


>ところで、何も無し版でbbb.cとccc.cでは
>extern char aaa_var;
>がありますが、グローバル変数を使用するだけならば不要ですよね?

他のファイルで「定義」したグローバル変数を使用するためにexternキー
ワードによる「宣言」は必要です。

試してください。


この投稿にコメントする

削除パスワード

No.28013

Re:グローバル変数の宣言と定義とexternおよび記述場所について
投稿者---miya(2006/08/31 20:26:14)


仰るとおりでした。すっきり解決です。
ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧