2

これは文章で説明するのは難しいので、例を挙げます。

//f1.c
int a = 5;

int main()
{
    printf("func2() output is: %i\n", func2() );
    return 0;
}


//f2.c
static int a = 3

int func2()
{
    extern int a;
    return a;
}

これをコンパイルして実行すると、5 を期待していたのに 3 になりました。なぜ 3 になったのか説明してもらえますか? 関数内で extern を使用することで、静的変数の値を使用しないと思っていたでしょう。

4

2 に答える 2

1

staticclass-modifier は、変数がこの変換単位でのみ表示されることを示します ( ) f2.cfor を使用externするとa、その変数を宣言しただけで、定義していません。それでも、atranslation-unit には利用可能な があったf2.cので、これを使用します。

于 2013-03-27T21:19:12.703 に答える
1

n1256 §6.2.2 ¶4 から:

その識別子の前の宣言が可視であるスコープ内で storage-class 指定子を使用externして宣言された識別子の場合、前の宣言が内部リンケージまたは外部リンケージを指定している場合、後の宣言での識別子のリンケージは、指定されたリンケージと同じです。事前宣言時。前の宣言が表示されない場合、または前の宣言でリンケージが指定されていない場合、識別子には外部リンケージがあります。

したがって、extern関数スコープ内とは、変数がデフォルトで外部リンケージを持つことを意味しますが、別の目に見える定義がある場合は、その定義が代わりに使用されます。

于 2013-03-27T21:23:46.190 に答える