c联系混乱

时间:2011-03-14 06:57:28

标签: c variables scope linkage

我是中级C程序员。我正在浏览C

中的简单代码片段
int a ; // A
const int b; // B
static int c; //C
void func(int d) // D
{
   //.....
}

变量a,b,c和d的联系是什么。我确信a默认情况下具有外部链接,bcd具有内部链接。我的理解是否正确?

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

4 个答案:

答案 0 :(得分:6)

来自C99的6.2.2, Linkages of identifiers部分,权威来源:

  

1 /在不同范围或同一范围内多次声明的标识符可以是    通过称为链接的过程来引用相同的对象或函数。有   三种联系:外部,内部和无。

     

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

     

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

     

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

     

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

     

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

     

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

现在,逐个处理变量:

  • a由第5部分涵盖,因为它是“具有文件范围且没有存储类说明符的对象的标识符”。因此它具有外部联系。
  • b也包含在第5部分(文件范围,没有存储类说明符)中。因此外部联系。
  • c由第3部分涵盖,因为它具有static存储类说明符 - 它具有内部链接。
  • 最后,d由第6部分涵盖,是一个函数参数 - 它没有链接。

答案 1 :(得分:4)

在C中,ab具有外部链接,c具有内部链接。在C ++中,你是对的,b也有内部联系。

对于案例“D”,我不确定你在说什么:函数或参数。 func有外部联系; d没有联系。

答案 2 :(得分:3)

  

我确信默认情况下,外部链接bcd具有内部链接。我的理解是否正确?

没有! d没有联系,因为它是一个形式参数。

来自C99

  

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

此外b在C99中有外部联系。在C ++中,文件范围内的const限定变量具有内部链接。

答案 3 :(得分:-2)

a,b和c都具有相同的链接,如果它们在全局范围内声明它看起来像是

d是一个函数参数,在调用该函数时创建,在函数返回时不再存在