为什么此代码不会生成重新声明错误?

时间:2016-10-15 00:26:52

标签: c extern static-variables

以下是externstatic变量,其名称相同。输出打印静态变量a = 10。为什么没有语法错误?如果需要,我将如何访问extern a

#include<stdio.h>
extern int a;
static int a=10;

main()
{
    printf("%d\n",a);
}

1 个答案:

答案 0 :(得分:2)

C标准允许相反,extern之后static

  

6.2.2标识符的链接
....
   3 如果对象或函数的文件范围标识符的声明包含存储类   说明符static,标识符具有内部链接。

     

4 对于在范围内使用存储类说明符extern声明的标识符   如果先前声明指定内部或,则可以看到该标识符的先前声明   外部链接, 后面声明中标识符的链接与   在先前声明中指定的联系 。如果没有先前的声明可见,或者如果先前声明   声明指定没有链接,那么标识符有外部链接。

同时声明:

  

7 如果在翻译单元内,同一标识符同时显示内部和外部   联系,行为未定义。

BTW,C ++标准明确指出:

  

7.1.1存储类说明符
....

static int b; // b has internal linkage
extern int b; // b still has internal linkage
     

...

extern int d; // d has external linkage
static int d; // error: inconsistent linkage