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 つは同じオブジェクトを参照する必要があります。
標準からの引用:
同じ名前と型を持つリンケージを持つエンティティの目に見える宣言がある場合、最も内側のエンクロージング名前空間スコープの外側で宣言されたエンティティは無視され、ブロック スコープ宣言は同じエンティティを宣言し、前の宣言のリンケージを受け取ります。一致するエンティティが見つからない場合、ブロック スコープ エンティティは外部リンケージを受け取ります。
しかし、なぜ人々はこの機能を必要とするのでしょうか?