C++11 標準では、以下のコード スニペットが提供され (関係のないコードを削除しました)、名前i
には外部リンケージがあると述べています。(条項 3.5.6)
static int i = 0; // #1
void g() {
extern int i; // #3 external linkage
}
なぜ彼らはこれを行うのですか?私は何かを誤解しましたか?この 2 つi
は、vs2012 では同じオブジェクトを参照しています。そして、i
どこかで使用すると、未解決の外部エラーが発生しました。vs2012 がこの機能をサポートしているかどうかはわかりません。
編集:VS2012は正しいことをしていると思います。#3のは、リンケージを持つi
を参照するだけで済みます。i
コンパイラが見つからない場合はi
、他の翻訳単位で定義する必要があります。したがって、i
上記のコード スニペットでは、この 2 つは同じオブジェクトを参照する必要があります。
標準からの引用:
同じ名前と型を持つリンケージを持つエンティティの目に見える宣言がある場合、最も内側のエンクロージング名前空間スコープの外側で宣言されたエンティティは無視され、ブロック スコープ宣言は同じエンティティを宣言し、前の宣言のリンケージを受け取ります。一致するエンティティが見つからない場合、ブロック スコープ エンティティは外部リンケージを受け取ります。
しかし、なぜ人々はこの機能を必要とするのでしょうか?