什么时候具有块范围的标识符的声明是否具有内部链接?

时间:2016-01-22 23:53:42

标签: c language-lawyer c11 linkage

我正在改变'C'标准并且我遇到了这个:

$ 6.7.9.5:

  

如果标识符的声明具有块范围,则   标识符有外部或内部链接,声明应   没有标识符的初始化程序。

所以我的问题是标题。如果可能的话,我也想要一些例子。

3 个答案:

答案 0 :(得分:1)

static int i; // internal linkage

void f() {
   extern int i; // block-scope declaration; refers to i in global scope
                 // still internal linkage - see 6.2.2/4
}

答案 1 :(得分:0)

这意味着以下

#include <stdio.h>

static int x = 1;

int main()
{
    int y = 2;

    {
        extern int x;

        printf( "x + y = %d\n", x + y );
    }
}

此处内部块变量x内部的main具有内部链接,表示在main之外定义的相同变量x

但是在这个程序中

#include <stdio.h>

static int x = 1;

int main()
{
    int y = 2;
    int x = 3;

    {
        extern int x;

        printf( "x + y = %d\n", x + y );
    }
}

使用说明符x声明的变量extern具有外部链接,它与在main之前定义的变量x不同。原因是其他局部变量x隐藏了在main之前定义的全局变量x

答案 2 :(得分:0)

您应该下载更新版本的C标准版。寻找n1570.pdf,C11标准的最新草案。它的语言更明确:

  

6.2.2标识符的链接

     
      
  1. 可以通过名为linkage的进程引用在不同作用域或同一作用域中多次声明的标识符来引用同一对象或函数。有三种联系:外部,内部和无。
  2.   
  3. 在构成整个程序的翻译单元和库的集合中,具有外部链接的特定标识符的每个声明表示相同的对象或功能。在一个翻译单元内,具有内部链接的标识符的每个声明表示相同的对象或功能。没有链接的标识符的每个声明都表示一个唯一的实体。

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

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

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

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

  12.   
  13. 如果在翻译单元中,同一标识符同时显示内部和外部链接,则行为未定义。

  14.