c联系混乱

Nov*_*vic 4 c variables scope linkage

我是中级C程序员.我正在浏览C中的一个简单代码片段

int a ; // A
const int b; // B
static int c; //C
void func(int d) // D
{
   //.....
}
Run Code Online (Sandbox Code Playgroud)

变量a,b,c和d的联系是什么.我很确定a默认情况下有外部链接b,c并且d有内部链接.我的理解是否正确?

这是我在这个网站上的第一个问题.

pax*_*blo 6

6.2.2, Linkages of identifiersC99 部分,权威来源:

1 /可以通过名为linkage的进程在不同作用域或同一作用域中多次声明的标识符引用相同的对象或函数.有三种联系:外部,内部和无.

2 /在构成整个程序的翻译单元和库的集合中,具有外部链接的特定标识符的每个声明表示相同的对象或功能.在一个翻译单元内,具有内部链接的标识符的每个声明表示相同的对象或功能.没有链接的标识符的每个声明表示唯一的实体.

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

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

5 /如果函数的标识符声明没有存储类说明符,则确定其链接与使用存储类说明符extern声明的链接完全相同.如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接是外部的.

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

7 /如果在翻译单元中,同一标识符同时出现内部和外部链接,则行为未定义.

现在,逐个处理变量:

  • a由第5部分涵盖,因为它是"具有文件范围且没有存储类说明符的对象的标识符".因此它具有外部联系.
  • b第5部分(文件范围,没有存储类说明符)也涵盖了这一点.因此外部联系.
  • c由于它具有static存储类说明符,所以它由第3部分涵盖- 它具有内部链接.
  • 最后,d由第6部分介绍,是一个函数参数 - 它没有链接.