В C переменные могут иметь различные области видимости: локальная (внутри блока), глобальная (во всём файле) и область видимости в пределах файла (static). Правильное управление областями видимости важно для предсказуемости работы и предотвращения конфликтов имён.
Видимы во всех функциях файла, а если объявлены с extern — во всём проекте.
Создаются при входе в блок (например, функцию или цикл). Не видны вне блока объявления.
static int foo; — только для текущего файла.
Пример:
static int counter = 0; // Только внутри файла void increment() { int temp = 10; // локальная переменная ++counter; }
Если глобальная и локальная переменные имеют одинаковое имя, какая из них используется внутри функции и почему?
Ответ: Используется локальная, т.к. она "затеняет" (shadowing) глобальное имя внутри своей области видимости. Глобальная переменная остаётся доступной вне блока объявления локальной переменной.
Пример:
int value = 5; void foo() { int value = 10; printf("%d", value); // выведет 10, а не 5 }
История
История
static для вспомогательной функции и переменной, это привело к конфликтам имён при компоновке (linking), а также к непредсказуемым ошибкам при сборке разных частей проекта.История
Встречались случаи, когда глобальные переменные использовались в многопоточном коде без должной синхронизации. Из-за неявной области видимости и невнимательности при изменении значения в разных потоках возникали гонки данных (data race).