【问题标题】:c linkage confusionc 链接混乱
【发布时间】:2011-07-14 19:36:07
【问题描述】:

我是中级 C 程序员。我在 C 中浏览了一个简单的代码 sn-p

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

变量a,b,c和d的链接是什么。我很确定a 默认有外部链接,bcd 有内部链接。我的理解正确吗?

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

【问题讨论】:

    标签: c variables scope linkage


    【解决方案1】:

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

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

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

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

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

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

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

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

    现在,一一处理你的变量:

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

    【讨论】:

    【解决方案2】:

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

    对于案例“D”,我不确定您在谈论哪个:函数或参数。 func有外部联动; d 没有链接。

    【讨论】:

      【解决方案3】:

      我很确定 a 默认情况下具有外部链接,bcd 具有内部链接。我的理解正确吗?

      不! d 没有链接,因为它是一个形参。

      从 C99 开始

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • d 是一个函数参数,但我认为 OP 是在谈论函数本身,它是可公开访问的。
        • 另外,int c 上的 'static' 关键字意味着它在当前源文件之外不可用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-28
        • 2019-10-08
        • 2013-03-03
        • 1970-01-01
        相关资源
        最近更新 更多