C中的全局静态和局部静态变量如何不会发生冲突

时间:2014-03-12 03:14:50

标签: c

我有一个全局静态变量' x'在我的程序中定义,我有本地静态变量' x'在同一程序的一个函数中定义。两者都应该驻留在数据段中。那么为什么编译器没有给出错误或如何解析名称。

2 个答案:

答案 0 :(得分:2)

您是正确的,两个变量都将存储在数据段中。但是,这些值只是存储在该段中的两个不同偏移量中。编译器使用范围区分这两个变量,并基于它将其转换为正确的偏移量。

答案 1 :(得分:2)

  

为什么编译器没有给出错误

因为这两个变量具有不同的范围,这意味着从编译器的角度来看它们是两个不同的变量。

  

如何解析名称

编译器可能会给他们不同的名字。

例如

static int x;

void foo(void) {
    static int x;
}

这是x

的符号
$ readelf -s t108.o | grep x
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     5: 0000000000000000     4 OBJECT  LOCAL  DEFAULT    3 x
     6: 0000000000000004     4 OBJECT  LOCAL  DEFAULT    3 x.1707