ヘッダーファイルに静的グローバル変数を置くのは意味がありますか? [重複] 質問する

ヘッダーファイルに静的グローバル変数を置くのは意味がありますか? [重複] 質問する

静的変数にはファイル スコープがあります。次の 2 つのファイルがあるとします。

  • ファイル1.h
  • ファイル1.cpp
  • ファイル2.h
  • ファイル2.cpp

static int Var1両方のヘッダー ファイルで静的変数 say を宣言しました。file1.hと は両方ともファイルfile2.hに含まれています。main.cpp

静的変数はファイル スコープを持つため、互いに競合しないようにこれを行いました。しかし、コンパイル後に競合が発生していることがわかりました。

これで、静的変数は変数のように動作しますextern。一方、両方の .cpp ファイルで静的変数を宣言すると、コンパイルは正常に行われます。

この動作は理解できません。

このシナリオでスコープとリンクがどのように機能するかを説明できる人はいますか。

ベストアンサー1

静的変数はコンパイル単位にローカルです。コンパイル単位基本的には、各ディレクティブの代わりにファイル.cppの内容が挿入されたファイルです。.h#include

さて、コンパイル単位では、同じ名前の 2 つのグローバル変数を持つことはできません。あなたのケースでは、と がmain.cpp含まれ、2 つのヘッダーのそれぞれが独自の を定義しています。file1.hfile.hVar1

論理的にこれらが 2 つの異なる変数である場合は、異なる名前を付けます (または異なる名前空間に配置します)。

これらが同じ変数である場合は、別のヘッダーファイルに移動し、との両方からvar1.hインクルードします。var1.hfile1.hfile2.h#include ガードvar1.h

おすすめ記事