Самое прикольное, что и в этой простой ситуации базар еще не окончен. Лексиконом буду :-). Так вот присмотритесь к коду ниже. Здесь нет ни одной ошибки.
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(); }
Такой вызов функций не запрещен, но он не возможен, если нельзя сначала определить, а потом реализовать.
Я немного отвлекся для демонстрации подхода к реализации и объявлениям. Ну ладно. Это для пояснения сути проблеммы, так как следование влияет на видимость.