以下是代码,我将其作为参考,以了解{}
函数中存在的子作用域(或)虚拟作用域(just)如何影响堆栈帧的结构。
#include <stdio.h>
int main()
{
int main_scope=0; /*Scope and life time of the variable is throughout main*/
{
//From below two statements I assume that there
//is no seperate "stack frame" created for just
//braces {}.So we are free access (scope exists) and
//modify (lifetime exists) the variable "main_scope"
//anywhere within main
main_scope++;
printf("main_scope++:(%d)\n",main_scope);
//I expected this statement to throw an error saying
//"Multiple definition for "main_scope".But it isn't????
int main_scope=2;
printf("Value of redefined main_scope:(%d)\n",main_scope);
}
printf("Finally main_scope in %s:(%d)\n",__FUNCTION__,main_scope);
return 0;
}
样本输出
main_scope++:(1)
Value of redefined main_scope:(2)
Finally main_scope in main:(1)
基于上述行为,我推测如下。
- 没有为范围创建堆栈帧
{}
。 - 通过这种方式
auto
,声明/定义的变量main
和子范围内的变量{}
共享相同的堆栈帧。 main
因此,在函数内的任何地方(甚至在子范围内)都可以自由访问声明/定义的变量。- 另一方面,在子作用域中声明/定义的变量在块外失去了作用域。但只要堆栈帧存在,它的生命周期就有效。
问题:如果上述几点是正确的,那么为什么在给出同一个变量的多个定义时代码没有失败,一个是 within main
,另一个是 within {}
。