6

次の識別子にはリンクがありません。オブジェクトまたは関数以外のものであると宣言された識別子。関数パラメーターとして宣言された識別子。ストレージクラス指定子externなしで宣言されたオブジェクトのブロックスコープ識別子

{
    static int a; //no linkage
}

ストレージクラス指定子externで宣言された識別子の場合、その識別子の前の宣言が表示されるスコープで、前の宣言が内部または外部のリンケージを指定している場合、後の宣言での識別子のリンケージはリンケージと同じです。事前の宣言で指定されています。以前の宣言が表示されていない場合、または以前の宣言でリンケージが指定されていない場合識別子には外部リンケージがあります。

{
    static int a; //no linkage
    extern int a; //a should get external linkage, no?
}

GCCエラー:リンケージのないfollows宣言のextern宣言

誰かが私にこのエラーが発生する理由を説明できますか?

ありがとうございました

4

2 に答える 2

8

あなたの仮定は正しいです: の 2 番目の宣言にaは外部リンケージがあります。ただし、コードが §6.7 の制約に違反しているため、エラーが発生します。

3 識別子にリンケージがない場合、6.7.2.3 で指定されているタグを除いて、同じスコープおよび同じ名前空間で (宣言子または型指定子に) 識別子の宣言が 1 つしか存在しないものとします。

つまり、aリンクがないことを宣言すると、同じスコープで再度宣言することはできません。


このルールが呼び出される有効な例は次のとおりです。

int a = 10;  /* External linkage */

void foo(void)
{
    int a = 5;  /* No linkage */

    printf("%d\n", a);    /* Prints 5 */

    {
        extern int a;  /* External linkage */

        printf("%d\n", a);    /* Prints 10 */
    }
}
于 2011-08-30T07:46:50.290 に答える
2

前の宣言でリンケージが指定されていない場合

意味

前の宣言が結合の兆候を指定していない場合

そしてそうではない

前の宣言でリンケージがないことが指定されている場合

これは紛らわしく、あいまいです。標準を書く通常の方法ではありません...

于 2011-08-30T07:40:31.307 に答える