グローバル変数が必要な場合は、.h ファイルで宣言し、1 つの (そして 1 つのみの) .cpp ファイルで定義するのが通常の方法です。
.h ファイル。
extern int x;
.cpp ファイル。
int x=3;
問題の本質は変数の型に依存しないため、例のように const char * ではなく int (おそらく最も基本的な基本型?) を使用しました。
基本的な考え方は、変数を複数回宣言できるということです。したがって、.h ファイルを含む各 .cpp ファイルで変数を宣言します。これで問題ありません。ただし、一度だけ定義します。定義は、変数の初期値 (= を使用) を割り当てるステートメントです。.h ファイルに定義を含める必要はありません。.h ファイルが複数の .cpp ファイルに含まれていると、複数の定義が得られるからです。1 つの変数に複数の定義がある場合、リンク時に問題が発生します。これは、リンカが変数のアドレスを割り当てたいのに、その変数のコピーが複数ある場合には適切に割り当てることができないためです。
Sud の混乱を和らげるために、後で追加された追加情報。
問題をよりよく理解するために、問題を最小限の部分に減らしてみてください。
3 つの .cpp ファイルで構成されるプログラムがあるとします。プログラムをビルドするには、各 .cpp を個別にコンパイルして 3 つのオブジェクト ファイルを作成し、次に 3 つのオブジェクト ファイルをリンクします。3 つの .cpp ファイルが次のような場合 (例 A、適切な構成)。
file1.cpp
extern int x;
file2.cpp
extern int x;
file3.cpp
extern int x;
その後、ファイルは問題なくコンパイルおよびリンクされます (少なくとも変数 x に関する限り)。各ファイルは変数 x を宣言しているだけなので問題ありません。宣言とは、使用できる (または使用できない) 変数がどこかにあることを示すだけです。
同じことを達成するためのより良い方法は次のとおりです (例 A、より良い構成)。
header.h
extern int x;
file1.cpp
#include "header.h"
file2.cpp
#include "header.h"
file3.cpp
#include "header.h"
#include ディレクティブは単純に別のファイルからテキストをプルするため、コンパイラは .cpp ファイル (または専門家が呼ぶ翻訳単位) を処理する際に、3 つのコンパイルのそれぞれで以前と同じテキストを認識します。 . それにもかかわらず、宣言が複数のファイルではなく 1 つのファイルにしかないため、これは以前の例よりも改善されています。
ここで、別の実際の例を考えてみましょう (例 B、優れた組織)。
file1.cpp
extern int x;
file2.cpp
extern int x;
file3.cpp
extern int x;
int x=3;
これもうまくいきます。3 つの .cpp ファイルはすべて x を宣言し、1 つが実際に x を定義しています。先に進んで、変数 x を操作する 3 つのファイルのいずれかの関数内にさらにコードを追加しても、エラーは発生しません。ここでも、ヘッダー ファイルを使用して、宣言が 1 つの物理ファイルにのみ入るようにする必要があります (例 B、より適切な編成)。
header.h
extern int x;
file1.cpp
#include "header.h"
file2.cpp
#include "header.h"
file3.cpp
#include "header.h"
int x=3;
最後に、うまくいかない例を考えてみましょう (例 C はうまくいきません)。
file1.cpp
int x=3;
file2.cpp
int x=3;
file3.cpp
int x=3;
各ファイルは問題なくコンパイルされます。この問題はリンク時に発生します。これは、 3 つの個別の int x 変数を定義したためです。は同じ名前で、すべてグローバルに表示されます。リンカーの仕事は、1 つのプログラムに必要なすべてのオブジェクトを 1 つの実行可能ファイルにプルすることです。グローバルに表示されるオブジェクトには一意の名前が必要です。これにより、リンカーはオブジェクトの 1 つのコピーを実行可能ファイル内の 1 つの定義済みアドレス (場所) に配置し、他のすべてのオブジェクトがそのアドレスにアクセスできるようになります。この場合、リンカはグローバル変数 x を使用してジョブを実行できないため、代わりにエラーを発生させます。
余談ですが、異なる定義に異なる初期値を指定しても問題は解決しません。各定義の前にキーワード static を付けると、変数がグローバルに表示されなくなり、定義されている .cpp ファイル内で表示されるようになるため、問題に対処できます。
グローバル変数の定義をヘッダー ファイルに入れても、本質的な変更はありません (例 C、この場合はヘッダー構成は役に立ちません)。
header.h
int x=3; // Don't put this in a .h file, causes multiple definition link error
file1.cpp
#include "header.h"
file2.cpp
#include "header.h"
file3.cpp
#include "header.h"
ふう、誰かがこれを読んで、それから何らかの利益を得ることを願っています. 質問者は、高度なコンピューター科学者の説明ではなく、基本的な概念に関する簡単な説明を求めて叫んでいることがあります。