11

ブロックで宣言されたすべての変数に「リンケージなし」がありますか?

例えば:

1:

静的変数を宣言すると:

void foo()
{
   static int i;
}

内部リンケージがありますか、それともリンケージがありませんか? リンケージがない場合、なぜそれを静的にするのですか?

2:

extern を使用するとどうなりますか?

/*global scope*/
static int i;

void foo()
{
    extern int i;
}

この場合、 のリンケージは何になりますiか?

4

2 に答える 2

6

実際、関数スコープでは「リンケージなし」です。

目標は有効期間の管理です。静的にはグローバル静的の有効期間がありますが、ローカルの可視性(スコープ) があります。

ノート

C++ では、スタティック (「グローバル」) を匿名の名前空間で囲むことにより、リンケージなしで宣言することもできます。このトリックは、ヘッダーのみのライブラリで一般的に使用されます。

namespace /*anon*/
{
    void foo() {}    // only in this translation unit
    int answer = 42; // this too
}

を使用するとどうなりますexternか?

extern を使用する場合、宣言はextern宣言のみです (何も定義されていません)。そのため、通常、定義により外部リンケージが期待されます-別の翻訳単位で定義されています。(そのため、グローバル スコープで宣言された場合と同じように動作します)。これは、ローカル関数の宣言に似ています。

int main()
{
    void exit(int); // equivalent to non-local declaration
}

2.あなたの例では、変数iはすでに宣言されstaticているため、外部リンケージを取得しないことに注意してください。ただし、リンカーの競合なしで別の翻訳単位で宣言される可能性があります。

于 2011-11-23T00:35:47.467 に答える
1
  1. 「内部リンケージがあるのか​​、リンケージがないのか?リンケージがない場合、なぜ静的にするのか?」-リンクはありません。static静的ストレージ期間を指定します。

  2. 「externを使用するとどうなりますか?」これは外部リンケージを持つ名前の宣言であり、グローバルスコープには何もないため、プログラムはリンケージエラーを報告します。編集:staticスコープに前の宣言が表示されているため、標準では「前の宣言のリンクを受け取る」3.5 / 6と記載されているため、i内部foo()には内部リンクがあります。

于 2011-11-23T00:37:58.007 に答える