3

私は組み込みCプロジェクトに取り組んでおり、グローバル変数の再定義に問題があります。

関数の宣言と定義をいくつかの.hファイルと.cファイルに分割しました。これらの関数の多くは、global_vars.hで定義されているグローバル変数にアクセスする必要があります。したがって、ヘッダーファイルの先頭の#ifndef、#defineセクション内の「global_vars.h」。そうしないと、ご想像のとおり、未定義の変数エラーが大量に発生します。

ただし、global_vars.hに#ifndef _GLOBAL_VARS_H_ #define ... #endifがある場合でも、すべてのグローバル変数の再定義エラーが発生します。私の推測では、リンカがさまざまなオブジェクトファイルをリンクしようとすると、すべての「blah_blah.h」ファイルにある#include「global_vars.h」による再定義が表示されます。ただし、#ifndef...がこの問題を処理することは私の理解でした。

見落としているものはありますか?

前もって感謝します

4

3 に答える 3

8

リンカーは、悪いニュースがない限り、global_vars.hファイルに何も表示されません。-一部のグローバルは、実際にはそのファイルで定義されています。global_vars.hは、これらのグローバル変数の宣言のみを保持する必要があり、それらの定義を保持することはありません(まあ、ほとんどありません)。

global_vars.hには、次のような宣言が必要です。

extern int some_global;

あなたが持つことは許可されていません:

int some_global;

global_vars.hに定義がある場合は、はい、リンク時に複数定義されます。これは、#includes global_vars.hを含む各.cファイルに、定義された各変数の独自の定義があるためです。

extern確かに、グローバルのすべての定義は、いくつかの.cファイルに含まれている必要があります。通常、どの.cファイルでもかまいません。多くの場合、すべてのグローバル変数定義は、(サプライズ!)global_vars.cというファイルにあります。

したがって、global_vars.hにグローバル変数の定義がないことを確認してください。そうすれば、良好な状態になります。

于 2011-06-16T21:39:41.400 に答える
2

Hファイルでグローバルを定義するのは良い考えではありません。これをCまたはC++ファイルで行い、それらのグローバルを外部として持つ他のモジュールにHファイルを含めるとよいでしょう。このように>>>

私のモジュールcファイル

unsigned short int AGLOBAL = 10; // definer and initializer

void MyFunc(void)
{
  AGLOBAL+=1; // no need to include anything here cause is defined above
  // more .....

}

私のHファイルglobals.h

// this is to include only once
#ifndef MYH
#define MYH
extern unsigned short int AGLOBAL; // no value in here!

#endif

その他のモジュールcファイル

#include globals.h

char SomeOtherFunc(void)
{
  AGLOBAL+=10; // ok cause its defined by globals.h
  // do more....
}
于 2011-06-28T20:11:28.567 に答える
1
于 2015-08-10T12:14:34.623 に答える