Программирование. Принципы и практика использования C++ Исправленное издание, стр. 110
Заголовки обычно включаются во многие исходные файлы. Это значит, что заголовок должен содержать лишь объявления, которые можно дублировать в нескольких файлах (например, объявления функций, классов и числовых констант).
8.4. Область видимости
Область видимости (scope) — это часть текста программы. Каждое имя объявляется в своей области видимости и является действительным (т.е. находится в области видимости), начиная с точки объявления и заканчивая концом данной области. Рассмотрим пример.
void f(){ g(); // ошибка: g() не принадлежит (пока) области видимости}void g(){ f(); // OK: функция f() находится в области видимости}void h(){ int x = y; // ошибка: переменная y не принадлежит (пока) // области видимости int y = x; // OK: переменная x находится в области видимости g(); // OK: функция g() находится в области видимости}Имена, принадлежащие области видимости, видны из вложенных в нее других областей видимости. Например, вызов функции
f()g()f()g()Существует несколько разновидностей областей видимости, которые можно использовать для управления используемыми именами.
• Глобальная область видимости (global scope). Часть текста, не входящая ни в одну другую область видимости.
• Пространство имен (namespace scope). Именованная область видимости, вложенная в глобальную область видимости или другое пространство имен (раздел 8.7).
• Область видимости класса (class scope). Часть текста, находящаяся в классе (раздел 9.2).
• Локальная область видимости (local scope). Часть текста, заключенная в фигурные скобки, { ... }, в блоке или функции.
• Область видимости инструкции (например, в цикле
forОсновное предназначение области видимости — сохранить локальность имен, чтобы они не пересекались с именами, объявленными в другом месте. Рассмотрим пример.
void f(int x) // функция f является глобальной; // переменная x является локальной в функции f{ int z = x+7; // переменная z является локальной}int g(int x) // переменная g является глобальной; // переменная x является локальной в функции g{ int f = x+2; // переменная f является локальной return 2*f;}Изобразим это графически.

Здесь переменная
xf()xg()xf()f()xg()g()fg()f()Рассмотрим логически эквивалентный, но более реальный пример использования локальной области видимости.
int max(int a, int b) // функция max является глобальной; // а переменные a и b — локальными{ return (a>=b) ? a : b;}int abs(int a) // переменная a, не имеющая отношения // к функции max(){ return (a<0) ? –a : a;}Функции
max()abs()?:a>=b)?a:baa>=bbint max(int a, int b) // функция max является глобальной; // а переменные a и b — локальными{ int m; // переменная m является локальной if (a>=b) m = a; else m = b; return m;}