代码之家  ›  专栏  ›  技术社区  ›  AnArrayOfFunctions

具有块范围的标识符的声明何时可以具有内部链接?

  •  5
  • AnArrayOfFunctions  · 技术社区  · 8 年前

    我正在围绕“C”标准转变,我遇到了这样一个问题:

    $6.7.9.5:

    如果标识符的声明具有块范围,并且 标识符具有外部 或内部联动装置 ,声明应 没有标识符的初始值设定项。

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

    3 回复  |  直到 8 年前
        1
  •  2
  •   T.C. Yksisarvinen    8 年前
    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
    }
    
        2
  •  0
  •   Vlad from Moscow    8 年前

    这意味着:

    #include <stdio.h>
    
    static int x = 1;
    
    int main()
    {
        int y = 2;
    
        {
            extern int x;
    
            printf( "x + y = %d\n", x + y );
        }
    }
    

    这里是内部块变量中的main x 具有内部链接并表示相同的变量 x(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(x) 用说明符声明 extern 具有外部链接,它与变量不同 x(x) 在main之前定义。原因是另一个局部变量 x(x) 隐藏全局变量 x(x) 在main之前定义。

        3
  •  0
  •   Community Egal    4 年前

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

    6.2.2标识符的链接

    1. 在不同作用域或同一作用域中多次声明的标识符可以通过称为链接的过程引用同一对象或函数。有三种联系:外部联系、内部联系和无联系。

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

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

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

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

    6. 以下标识符没有链接:声明为对象或函数以外的任何标识符;声明为函数参数的标识符;未使用存储类说明符声明的对象的块范围标识符 外部 .

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