【问题标题】:c language, global symbol, local symbol clarificationc语言,全局符号,局部符号说明
【发布时间】:2020-08-08 11:37:46
【问题描述】:

给定以下 c 代码

static int x = 0;

int what_is_this(void) {
    static int y = 5;
    x = x + y;
    y = y + 1;
    return y;
}

int main(void) {
    int v = what_is_this();
    printf("%d\n", v);
    return v;
}

关于链接器,what_is_this 是全局符号吗?

x 是本地符号吗?

v 没有注册为符号吗?

【问题讨论】:

    标签: c


    【解决方案1】:

    在这里:https://people.cs.pitt.edu/~xianeizhang/notes/Linking.html#symbol

    • global:由模块 m 定义的全局符号,可以被其他模块引用。全局链接器符号对应于 没有静态定义的非静态函数和全局变量 属性。
    • external:由模块 m 引用但由其他模块定义的全局符号。这样的符号被称为外部符号和 对应于其他模块中定义的funcs和vars。
    • local(静态):由模块 m 专门定义和引用的局部符号。一些本地链接器符号对应于函数 和使用静态属性定义的全局变量。这些 符号在模块 m 内的任何地方都可见,但不能被引用 通过其他模块。

    所以简单来说全局符号是非静态、非外部函数,非静态、非外部变量、外部符号用extern声明,局部符号是静态的。

    关于链接器,what_is_this 是全局符号吗?

    不是外部的,不是静态的,所以是的

    x 是局部符号吗?

    用静态声明,所以是的

    v 没有注册为符号吗?

    链接器永远不会看到局部变量声明。(可能在函数中声明的静态变量之外。)

    【讨论】:

    • 关于最后一个问题,所以v 没有注册为符号,因为链接器永远不会看到局部变量声明。这是正确的吗?
    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 2011-03-09
    • 2011-11-18
    • 1970-01-01
    • 2011-02-05
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多