块范围链接C标准

min*_*ess 6 c standards scope extern linkage

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

{
    static int a; //no linkage
}
Run Code Online (Sandbox Code Playgroud)

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

{
    static int a; //no linkage
    extern int a; //a should get external linkage, no?
}
Run Code Online (Sandbox Code Playgroud)

GCC错误:没有链接的以下声明的extern声明

有人可以解释我为什么会出现这个错误?

谢谢

caf*_*caf 8

你的假设是正确的:第二个声明a有外部联系.但是,您收到错误,因为您的代码违反了第6.6节中的约束:

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 */
    }
}
Run Code Online (Sandbox Code Playgroud)