0

重複の可能性:
C では許可されているが C++ では許可されていない再定義?

#include<stdio.h>
int i;
int i;
int main()
{
        // int i;
        // int i;
        printf("%d\n",i);
        return 0;
}
~          

上記のコードはエラーなしで実行されますgcc -Wall -Werror demo.c -o demo

しかし、local i変数のコメントを外すと、コメントアウトされ、global iエラーが発生します。

In function ‘main’:
demo.c:7:6: error: redeclaration of ‘i’ with no linkage
demo.c:6:6: note: previous declaration of ‘i’ was here

ここでのこのローカル グローバルの概念は何ですか?, どなたか説明してください。

4

2 に答える 2

2

C99(より具体的にはセクション6.2を参照)では、グローバル宣言にはデフォルトで外部リンケージ(6.2.2§5)があります。その場合(6.2.2§2)、iの両方の宣言は同じオブジェクトを参照します。それどころか、ローカル変数にはリンクがないため(6.2.2§6)、一意の識別子を参照することになっています(ここでも6.2.2§2)。したがって、同じ名前の2つのローカル変数が許可されていない同じスコープ(6.2.1§5:同じ識別子で指定された異なるエンティティは、異なるスコープを持っているか、異なる名前空間にあります

于 2012-11-08T17:51:05.927 に答える
1

すべての定義が一致し (すべて同じ型を持ち)、変数が複数の場所で初期化されていない場合、グローバル スコープで変数の複数の定義を使用できます。

J.5.11 複数の外部定義

キーワード extern の明示的な使用の有無にかかわらず、オブジェクトの識別子には複数の外部定義が存在する場合があります。定義が一致しない場合、または複数が初期化されている場合、動作は未定義です (6.9.2)。

于 2012-11-08T17:43:29.293 に答える