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