Имеют ли функции доступ к переменным в непосредственной внешней области без ввода параметров в функцию в C ++?

Имеют ли функции доступ к переменным в ближайшей внешней области без ввода параметров в функцию в C ++?

=========

Вот код, над которым я работаю

#include...
void ReadGrid();
void SaveGrid();

int main(){
ReadGrid();
}

void ReadGrid() {
int m=1;
int n[]={1,2,3};
vector<int> o(3,10);
SaveGrid();
}

void SaveGrid() {
int a=m;
int b=n[1];
int c=o[1];
}

Почему я не могу получить доступ к переменным в ReadGrid() функции в SaveGrid(), не местный охват SaveGrid() относиться к сфере ReadGrid() как глобальный, когда SaveGrid() называется?

2

Решение

Ваш вопрос может быть лучше сформулирован так:

Когда функция a() функция вызова b()делает b() автоматически получить видимость во всех a()локальные переменные?

И ответ нет. Они по-прежнему являются разными областями блоков, независимо от вашего стека вызовов.

2

Другие решения

Каждый набор фигурных скобок обозначает отдельную область видимости, поэтому, если вы создадите блок с фигурными скобками и объявите переменные внутри них, они не будут видны за его пределами. Если вы создаете вложенные блоки фигурных скобок, у них внутренний блок имеет доступ к внешнему блоку, но не наоборот.

Это также относится не только к функции (которая всегда имеет свою область действия), но также и к блокам внутри функции.

т.е. две разные переменные названы i, именная строка отсутствует из-за разных областей применения:

{
int i;
}

{
int i;
}

Здесь у нас есть доступ.

{
int i;
{
int x = i;   <== in scope
}

int y = x; <== error
}

Если вы хотите, чтобы переменные были связаны с какой-то логической функцией, вы должны поместить их в класс или структуру.

1

Нет, но здесь объекты могут вступать в игру, например, в этом псевдокоде они используют одни и те же данные:

class Grid {
private:
int m;
int n[];
vector<int> o;

public:
void ReadGrid(){
// get m,n, and o
}

void SaveGrid() {
// put m,n, and o
}
}

int main(){
Grid grid;
grid.ReadGrid();
}
0

Нет, то, что пытаются сделать, нелогично.

Если вы хотите, чтобы значение m было доступно как для ReadGrid, так и для SaveGrid, вы должны определить «m» как глобальную переменную, и вы можете инициализировать его в ReadGrid и использовать то же значение в SaveGrid.

Вот фрагмент, для вашей справки

#include...
void ReadGrid();
void SaveGrid();

int m;// global variable
int n[];//global variable

int main(){
ReadGrid();
}

void ReadGrid() {
m=1;
n[]={1,2,3};
SaveGrid();
}

void SaveGrid() {
int a=m;
int b=n[1];
}
0
По вопросам рекламы [email protected]