6

以下标识符没有链接: 声明为对象或函数以外的任何标识符;声明为函数参数的标识符;没有存储类说明符 extern 声明的对象的块范围标识符

{
    static int a; //no linkage
}

对于在该标识符的先前声明可见的范围内使用存储类说明符 extern 声明的标识符,如果先前声明指定内部或外部链接,则后面声明的标识符的链接与链接相同在事先声明中指定。如果没有可见的先前声明,或者先前的声明未指定链接则标识符具有外部链接

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

GCC 错误:没有链接的后续声明的外部声明

有人可以解释我为什么会收到此错误吗?

谢谢

4

2 回答 2

8

您的假设是正确的:第二个声明a具有外部链接。但是,您会收到错误,因为您的代码违反了 §6.7 中的约束:

3 如果标识符没有链接,除了 6.7.2.3 中规定的标签外,不得有超过一个标识符声明(在声明符或类型说明符中)具有相同的范围和相同的名称空间。

也就是说,一旦您声明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 回答