C语言中全局符号和局部符号的澄清

3

给定以下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 没有被注册为符号吗?

1个回答

2
根据这里:https://people.cs.pitt.edu/~xianeizhang/notes/Linking.html#symbol
  • 全局:由模块m定义并可以被其他模块引用的全局符号。全局链接器符号对应于未带有static属性定义的非静态函数和全局变量。
  • 外部:模块m引用但由其他模块定义的全局符号。这些符号称为外部符号,对应于在其他模块中定义的函数和变量。
  • 本地(静态):仅由模块m定义和引用的本地符号。某些本地链接器符号对应于使用static属性定义的函数和全局变量。这些符号在模块m中任何地方都可见,但无法被其他模块引用。
因此,简单来说,全局符号是非静态、非外部函数和非静态、非外部变量,外部符号是使用extern声明的,本地符号是静态的。
关于链接器,what_is_this是一个全局符号吗?
不是extern,也不是static,所以是的。
x是一个本地符号吗?
使用了static声明,所以是的。
v没有注册为符号吗?
链接器从未看到局部变量声明。(除了可能在函数中声明的静态变量。)

关于上一个问题,所以 v 没有被注册为符号,因为链接器从未看到局部变量声明。这是正确的吗? - WJL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接