Ниже приведен код, который я взял в качестве ссылки, чтобы понять, как вспомогательная область (или) фиктивная область видимости (просто {}
), присутствующая в функции, влияет на структуру кадра стека.
#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
, могут быть доступны в любом месте функции (даже в подпространстве). - С другой стороны, переменные, объявленные / определенные в подпространстве теряют свою область видимости вне блока, но время их жизни действительно до тех пор, пока присутствует кадр стека.
Вопрос: Если приведенные выше пункты верны, то почему код не дает сбоев при предоставлении нескольких определений одной и той же переменной, одно в пределах main
, а другое - в {}
.