1

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 つは同じオブジェクトを参照する必要があります。

標準からの引用:

同じ名前と型を持つリンケージを持つエンティティの目に見える宣言がある場合、最も内側のエンクロージング名前空間スコープの外側で宣言されたエンティティは無視され、ブロック スコープ宣言は同じエンティティを宣言し、前の宣言のリンケージを受け取ります。一致するエンティティが見つからない場合、ブロック スコープ エンティティは外部リンケージを受け取ります。

しかし、なぜ人々はこの機能を必要とするのでしょうか?

4

3 に答える 3

1
extern int i;

コンパイラを約束します私はあなたにint i.

はそのstatic int i=0;約束された変数ではなく、int iその変数宣言に見える他の場所を宣言する必要がありますextern

つまりextern int i;、 とstatic int i=0;は無関係な 2 つの変数です。

于 2013-04-16T14:53:14.130 に答える