C言語グローバル変数
1531 ワード
周知のように、グローバル変数は、メモリ割り当てが得られ、他のモジュールによってC言語のexternキーワードで呼び出されることができる変数であるべきである.したがって、必ず.c和.hファイルで定義します.このような繰り返しの定義は誤りを招きやすい.以下で説明する方法は、ヘッダファイルで一度だけ定義する必要があります.ちょっとわかりにくいですが、いったん身につけると、使い勝手がいいです.以下の定義は、すべてのグローバル変数を定義する.Hヘッダファイルにあります.
.hファイルの各グローバル変数にxxx_が追加されましたEXTの接頭辞.xxxはモジュールの名前を表します.このモジュールの.cファイルには以下の定義があります.
コンパイラで処理するCファイルの場合、xxx_を強制します.EXT(対応する.Hファイルで見つけられる)が空です.(xxx_GLOBALSが定義されているため).コンパイラは各グローバル変数にメモリ領域を割り当てるが、コンパイラが他の.cファイルを処理する場合、xxx_GLOBALは定義されず、xxx_EXTはexternとして定義され、ユーザは外部グローバル変数を呼び出すことができる.この概念を説明するために、uC/OS_II.hを参照し、以下の定義を含む.
また、uCOS_II.Cには以下の定義がある.
コンパイラがuCOSを処理するときII.Cの場合、ヘッダファイルは、OS_EXTは空に設定されています.
これにより、コンパイラはこれらのグローバル変数をメモリに割り当てます.コンパイラが他を処理するとき.Cファイルの場合、ヘッダファイルは次のようになります.OS_GLOBALは定義されていないのでOS_EXTはexternとして定義される.
この場合、メモリの割り当ては発生する、何も発生しない.Cファイルでは、これらの変数を使用できます.これはただ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ファイルでは一度定義すればよい.