Инкапсуляция - это скрытие имен переменных, функций, макросов от частей программы которая в них не нуждается. Такой подход уменьшает вероятность конфликта имен, не засоряет пространство имен.
Перечислим основные способы управления областью видимости (если переменная или функция видна - она доступна для использования) переменных и функций:
1) Переменные и функции определенные в заголовочном файле (\*.h) видны во всех файлах где они включены (явно или неявно - через включение других заголовочных файлов в которых они включены).
2) Переменные и функции определенные в исходном файле (\*.c) видны только в этом файле. Поэтому желая скрыть переменные и функции - определяем переменные и прототипы функций в исходном файле. Обойти это ограничение можно объявлением этой переменной с применением ключевого слова extern, таким образом можно "увидеть и использовать" нужные переменные, объявленные в других исходных файлах.
3) Переменные объявленные внутри блока видны только в этом блоке.