Шаг 15 - Область видимости. Продолжение 2

Самое прикольное, что и в этой простой ситуации базар еще не окончен. Лексиконом буду :-). Так вот присмотритесь к коду ниже. Здесь нет ни одной ошибки.

int i;

void main()
{
	int i;
	i=5;
}

void inf()
{
	i=7;
}

По логике рассказанного компилятор должен был заверищать о том, что в данном случае два имени. Ведь в main объявлено имя, которое есть в более высокой области. А нет !!! Все сложнее в нашем варианте с функциями. Логика такая. Если имя объявлено в осласти CPP и не объявлено в функции, то используется более глобальная переменная, если имя объявлено в функции, то локальное. Смотрите на main в данном случае присвоение i=5 не изменит i глобальную. Почему ??? Потому, что имя объявленно в функции. А в inf изменит потому, что имя в функции не объявлено и компилятор использует глобальное имя.

Пора кричать бардак. Мы запутаемся !!! Запутаетесь. Получается, что объяви в функции имя то же самое, что и глобальное на уровне CPP, то про последнее можно забыть ??? А вот нет. Есть такой хитрый ход, который явно меняет уровень видимости. Что выведется в данному случае ???

int i;

void main()
{
	int i;
	::i=5;
	i=10;
	cout << ::i;
}

Выведется 5. А вот в этом ???

int i;
void inf();

void main()
{
	int i;
	inf();
	i=10;
	cout << ::i;
}

void inf()
{
 i=5;
}

То же выведется 5. Почему ??? Так вот этот знак :: говорит о том, что чихать на то, что объявлено в функции и пользоваться уровнем CPP. Кстати обратите внимание на то, что мне пришлось объявить функцию inf это все из-за правила выше. Вот в таком варианте объявлять не надо.

int i;

void inf()
{
 i=5;
}

void main()
{
	int i;
	inf();
	i=10;
	cout << ::i;
}

Надо сделать вывод, что объявления без реализации созданы, чтобы избежать проблем следования друг за другом. В чем заключается ошибка следования ??? Смотрите.

void a1()
{
	a2();
}

void a2()
{
	a1();
}

Такой вызов функций не запрещен, но он не возможен, если нельзя сначала определить, а потом реализовать.

Я немного отвлекся для демонстрации подхода к реализации и объявлениям. Ну ладно. Это для пояснения сути проблеммы, так как следование влияет на видимость.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 21.04.2000