。 「グローバル」変数とは、コード内の任意のポイントで使用可能な変数ですが、標準でグローバルの正式な定義はありません。スコープ、格納期間、リンケージなどのより正式な用語を使用します。
グローバルの定義は1つのファイルに適用され、別のものは複数のファイルに適用されます。
複数のCソースファイルにそのヘッダーファイルを含めてそれらをリンクしてみると、各オブジェクトファイルに自身のの変数のコピーがあり、リンクエラーが発生します。 すべてエクスポートしようとしています。
あなたの変数は、単一のソースファイルのグローバルもそのソースファイルの先頭にそれらを入れて、(リンカを効果的に見えない)、それらを静的にしたい場合:
static int state;
これは、すべての機能を意味し、そのファイルにはまだアクセスできますが、他のファイルに干渉することはありません。あなたの変数はすべてのソースファイル間でグローバルになりたい場合は
しかし、ヘッダファイル内宣言と1つのCソース・ファイル内の定義を置きます。宣言は、定義は存在にそれをもたらしながら、何かが存在することを宣言しています。
something.h:
extern int state; // declare it
file1.c:
#include "something.h" // declare it (in header)
int state; // AND define it.
// Now you can use state anywhere.
file2.c:
#include "something.h" // declare it (in header)
// Now you can use state anywhere.
これは、すべてのファイルがアクセス権を持っているstate
のコピーがあることを意味します。
グローバル変数を使用するという点では、できるだけ避けるべきです。それらを使用するとカプセル化がはるかに難しくなり、コードの内部が外部からの操作にさらされます。
基本的なルールは、個々のアイテムに可能な限り小さな範囲を使用することです。これにより、あなたはあなたの目的を達成することができます。そして時々、物事を回すことを意味します。
本当にそれらを渡したくないのであれば、少なくともそれを隠すことができるように、すべてのデータとそれを操作するコードを1つのファイルに分離してください。
大丈夫です。ありがとうございました。私は、コードを書き直す必要があったり、エラーが多かったりする前に確かめたいと思っていました。 – Sams
あなたは彼らが何であるかを知ったので、賢明に使いましょう。パラメーターを渡すのを避けるためにそれらを使用しないでください。グローバルデータを持つことが理にかなっている場合(つまり、あるインスタンスを必要とし、多くの場所で参照されている場合)、それらを使用します。グローバルデータには、多くの*下振れリスクがあります。慎重に踏んでください。 –
しかし、ヘッダー内の変数を宣言しただけでなく、*定義した*もあります。あなたはそうしてはいけません:いくつかのモジュールが同じ名前を使用している場合、名前の競合が発生します。 – Matthias