ISO 標準ドラフトから: § 3.0/9
:
n3234 言います:
複数の翻訳単位で使用される名前は、各翻訳単位で指定された名前のリンケージ (3.5) に応じて、これらの翻訳単位で同じエンティティを参照する可能性があります。
誰かがこの点を例で説明できますか?
その声明は実際に何を言っているのですか?プログラムの観点からこの点を証明できる人はいますか?
もちろん!つまり、複数のソース ファイル (翻訳単位) が両方とも何らかの名前 (たとえば、変数、クラス、または関数の名前) を使用している場合、それらの異なるファイルが同じ変数について話している可能性があるということです。クラス、または関数、そのエンティティが異なるファイル間で見えるようにする方法で宣言されていると仮定します(つまり、そのリンケージに応じて)。
たとえば、次のファイルがあるとします。
A.cpp:
int globalInt;
int main() {
globalInt = 137;
}
そして、これはここにあります:
B.cpp:
extern int globalInt;
void foo() {
globalInt = 42;
}
次に、両方のファイルで、名前はA.cpp で定義されglobalInt
たグローバルint
変数を参照します。globalInt
この点が言っていることはそれだけです。
ただし、globalInt
外部リンケージなしで宣言すると、2 つのファイルは異なる変数について話していることに注意してください。たとえば、この場合:
C.cpp:
static int globalInt;
int main() {
globalInt = 137;
}
D.cpp:
static int globalInt;
void foo() {
globalInt = 42;
}
現在、globalInt
C.cpp で参照されている変数は、同じ名前を持っていても、D.cpp の変数と同じではありません。
お役に立てれば!
ああ、標準... 明白なものを難読化しましょう。
2 つの異なるソース ファイルで同じ名前のグローバル変数を使用する場合、それらが指定されているextern
か指定されていない場合、それらは同じ変数になりますが、それらのいずれかが宣言されている場合、それらはstatic
完全に独立しています。それらはそのソース ファイルでのみ表示されるためです。
int a; // can be seen in other files; this may be duplicated in multiple source files
static int b; // can only be used in this file
extern int c; // explicitly using a visible variable "c" defined in another file
(「リンケージ」はstatic
/ extern
/デフォルトのグローバルでauto
あり、「スタックに割り当てられている」ことを意味するため、ほとんど言及されていません。これは、関数内で宣言された変数のデフォルトであり、明らかに関数外の宣言には意味がありません。 unit」は、標準が「ファイル」への言及を避けるための一般的な方法です。)