如果我们在全局和本地创建一个具有相同名称的静态变量,意味着代码将被编译。但我希望它会给出重新定义的错误,因为静态变量将存储在数据段内存中,但我们不能在同一数据段中创建两个相同的变量。那为什么要编译呢?实际上这两个变量将被存储在哪里?请任何人你能回答......
这是我用过的示例代码,
static int var = 100;
void main()
{
static int var = 200;
printf("\n Var:%d\n", var);
}
答案 0 :(得分:1)
这两个变量即使存储在同一部分中,因为它们的存储类说明符相同,它们的范围也会不同。这就是它们的区别。我们也可以这样做 - 你不要问它是否正常
int main(void){
int a = 1;
{
int a = 2;
}
}
在您的情况下,编译器将尝试在使用时找到变量var
,并将采用将首先找到的变量。在main
内,将考虑本地var
。但是在其他函数中,如果引用var
而没有声明任何具有相同名称的变量,它将访问全局变量。
如果使用此标志进行编译,一个好的编译器会警告你-Wshadow
中的gcc
选项会告诉你这个。
您应该清楚的想法是 - 不会对同一个变量进行任何碰撞或重新定义 - 它们是定义它们的不同范围。