C言語グローバル変数

1531 ワード

周知のように、グローバル変数は、メモリ割り当てが得られ、他のモジュールによってC言語のexternキーワードで呼び出されることができる変数であるべきである.したがって、必ず.c和.hファイルで定義します.このような繰り返しの定義は誤りを招きやすい.以下で説明する方法は、ヘッダファイルで一度だけ定義する必要があります.ちょっとわかりにくいですが、いったん身につけると、使い勝手がいいです.以下の定義は、すべてのグローバル変数を定義する.Hヘッダファイルにあります.
#ifdef   xxx_GLOBALS
#define  xxx_EXT
#else
#define  xxx_EXT extern
#endif

.hファイルの各グローバル変数にxxx_が追加されましたEXTの接頭辞.xxxはモジュールの名前を表します.このモジュールの.cファイルには以下の定義があります.
#define  xxx_GLOBALS
#include "includes.h"

コンパイラで処理するCファイルの場合、xxx_を強制します.EXT(対応する.Hファイルで見つけられる)が空です.(xxx_GLOBALSが定義されているため).コンパイラは各グローバル変数にメモリ領域を割り当てるが、コンパイラが他の.cファイルを処理する場合、xxx_GLOBALは定義されず、xxx_EXTはexternとして定義され、ユーザは外部グローバル変数を呼び出すことができる.この概念を説明するために、uC/OS_II.hを参照し、以下の定義を含む.
#ifdef   OS_GLOBALS
#define  OS_EXT
#else
#define  OS_EXT extern
#endif

OS_EXT  INT32U       OSIdleCtr;
OS_EXT  INT32U       OSIdleCtrRun;
OS_EXT  INT32U       OSIdleCtrMax;

また、uCOS_II.Cには以下の定義がある.
#define  OS_GLOBALS
#include “includes.h”

コンパイラがuCOSを処理するときII.Cの場合、ヘッダファイルは、OS_EXTは空に設定されています.
INT32U       OSIdleCtr;
INT32U       OSIdleCtrRun;
INT32U       OSIdleCtrMax;

これにより、コンパイラはこれらのグローバル変数をメモリに割り当てます.コンパイラが他を処理するとき.Cファイルの場合、ヘッダファイルは次のようになります.OS_GLOBALは定義されていないのでOS_EXTはexternとして定義される.
extern      INT32U       OSIdleCtr;
extern      INT32U       OSIdleCtrRun;
extern      INT32U       OSIdleCtrMax;

この場合、メモリの割り当ては発生する、何も発生しない.Cファイルでは、これらの変数を使用できます.これはただHファイルでは一度定義すればよい.