警備員を配置しているのに、なぜこれが起こるのですか? 最初のアクセス後にヘッダーが読み取られないようにしていると思いました。
インクルード ガードは、ヘッダーが1 つのファイル(翻訳単位) に 1 回だけ含まれるようにします。ヘッダーを含む複数のファイルの場合、各ファイルにヘッダーを含める必要があります。
ヘッダー ファイルで外部リンケージ (グローバル変数) を使用して変数を宣言するのとは対照的に、 を定義することにより、ヘッダーを一度のソース ファイルにのみ含めることができます。複数のソース ファイルにヘッダーを含めると、変数の複数の定義が存在することになりますが、これは C++ では許可されていません。
したがって、お気づきのように、まさに上記の理由から、ヘッダー ファイルで変数を定義するのは悪い考えです。
このヘッダーの多数の列挙型が LNK4006 警告を出さないのはなぜですか?
それらは「グローバル変数」を定義しないため、型などに関する宣言にすぎません。ストレージを予約しません。
署名の前に static を追加すると、警告は表示されません。このようにすることの意味は何ですか。
変数を作成すると、静的スコープstatic
が設定されます。オブジェクトは、それが定義されている翻訳単位 (ファイル) の外では見えません。したがって、簡単に言えば、次の場合:
static int i;
ヘッダーでは、ヘッダーをインクルードする各ソース ファイルは個別 int
の変数を取得しますi
が、これはソース ファイルの外では見えません。これは内部リンケージとして知られています。
エラーを回避するためのより良い方法はありますが、ヘッダーで配列を宣言できます。配列定義のためだけに cpp ファイルを用意するのは本当に嫌です。
配列をすべての C++ ファイルから見える 1 つのオブジェクトにしたい場合は、次のようにする必要があります。
extern int array[SIZE];
をヘッダー ファイルに追加し、変数を必要とするすべての C++ ソース ファイルにヘッダー ファイルをインクルードしますarray
。ソース ( ) ファイルの1 つで、以下.cpp
を定義する必要がありますarray
。
int array[SIZE];
ヘッダーとソース ファイルの違いによる間違いを見つけられるように、上記のソース ファイルにもヘッダーを含める必要があります。
基本的に、 「はどこかで定義されており、型とサイズを持ってextern
いる」ことをコンパイラに伝えます。次に、実際に定義するのは 1 回だけです。リンク段階では、すべてがうまく解決されます。array
int
SIZE
array