静的変数にはファイル スコープがあります。次の 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.h
file.h
Var1
論理的にこれらが 2 つの異なる変数である場合は、異なる名前を付けます (または異なる名前空間に配置します)。
これらが同じ変数である場合は、別のヘッダーファイルに移動し、との両方からvar1.h
インクルードします。var1.h
file1.h
file2.h
#include ガードでvar1.h
。