块范围链接C标准

时间:2011-08-30 07:26:05

标签: c scope extern standards linkage

以下标识符没有链接:声明为对象或函数以外的任何标识符;声明为函数参数的标识符; 在没有存储类说明符extern 的情况下声明的对象的块作用域标识符。

{
    static int a; //no linkage
}

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

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

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

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

谢谢

2 个答案:

答案 0 :(得分: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 */
    }
}

答案 1 :(得分:2)

  

如果先前声明指定没有链接

装置

  

如果先前的声明没有指明链接的标志

而不是

  

如果先前声明指定它没有链接

这令人困惑和含糊不清;不是写标准的通常方式......