以下是我的代码:
#include <stdio.h>
static int a; // this static variable scope is through out the file
int main()
{
static int a; // this static variable scope is only in main()
}
现在在这个程序中,编译器会将变量a存储到数据段(确切地说是bss段),所以如果两个变量都转到同一个段,编译器将如何识别当用户想要更改或读取任何一个时访问哪一个他们。
例如,如果用户想要更改main()中变量a的值,编译器将如何识别哪个&#39; a&#39;改变数据段内存。
答案 0 :(得分:1)
编译器知道上下文需要哪个静态变量。区分实际变量的一种方法是通过修改名称。我尝试了一个稍微修改过的程序版本:
#include <stdio.h>
static int a; // this static variable scope is through out the file
int main()
{
static int a; // this static variable scope is only in main()
a=1;
}
void f()
{
a = 2;
}
如果您通过ELLCC demo page运行源代码(不要忘记关闭优化!),您可以查看编译器为您喜欢的目标处理器生成的内容。在汇编语言中,您可以看到编译器创建了两个变量: a 和 main.a 。 ELLCC编译器基于clang / LLVM,但其他编译器也会做类似的技巧。
查看编译器的程序集输出是回答这类问题的好方法。