extern и глобальные переменные
Общий доступ между файлами
«extern и глобальные переменные» — бесплатный урок C Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.
Глобальные переменные
Переменная, объявленная вне любой функции, имеет область видимости файла и существует всю программу. Это глобальная переменная.
#include <stdio.h>
int counter = 0;
void bump(void) {
counter++;
}
int main(void) {
bump();
bump();
printf("counter = %d\n", counter);
return 0;
}Глобальные переменные являются общими
Любая функция в файле может читать и изменять глобальную переменную. Это удобно, но такие переменные легко использовать неправильно.
#include <stdio.h>
int score = 100;
void penalty(void) { score -= 25; }
void bonus(void) { score += 10; }
int main(void) {
penalty();
bonus();
printf("score = %d\n", score);
return 0;
}Инициализация нулём по умолчанию
Глобальные переменные без инициализатора автоматически получают значение 0.
#include <stdio.h>
int total;
int main(void) {
printf("total = %d\n", total);
return 0;
}Ключевое слово extern
extern объявляет глобальную переменную, которая определена в другом месте. Оно сообщает компилятору о существовании переменной, не выделяя для неё память.
#include <stdio.h>
int shared = 5;
extern int shared;
int main(void) {
printf("shared = %d\n", shared);
return 0;
}Объявление и определение
Определение выделяет память. Объявление только сообщает имя чего-либо. Объявления extern память не выделяют.
#include <stdio.h>
int value = 42;
int main(void) {
extern int value;
printf("value = %d\n", value);
return 0;
}Общий доступ из разных файлов
В проектах из нескольких файлов один файл .c определяет глобальную переменную, а другие файлы используют extern в заголовочном файле, чтобы получить к ней доступ.
#include <stdio.h>
extern int globalCount;
int globalCount = 3;
int main(void) {
printf("globalCount = %d\n", globalCount);
return 0;
}Функции тоже могут быть extern
Функции по умолчанию имеют внешнее связывание, поэтому прототип фактически является объявлением этой функции с extern.
#include <stdio.h>
extern void hello(void);
void hello(void) {
printf("Hello from extern\n");
}
int main(void) {
hello();
return 0;
}Время жизни глобальных переменных
Глобальные переменные существуют от запуска до завершения программы, поэтому их значения сохраняются между всеми вызовами функций.
#include <stdio.h>
int visits = 0;
void page(void) { visits++; }
int main(void) {
page();
page();
page();
printf("visits = %d\n", visits);
return 0;
}Риски глобальных переменных
Поскольку любой код может изменить глобальную переменную, ошибки становится трудно отслеживать. По возможности предпочитайте передавать значения в качестве параметров.
#include <stdio.h>
int config = 1;
int compute(int input) {
return input * config;
}
int main(void) {
printf("%d\n", compute(8));
return 0;
}Глобальные переменные только для чтения
Сочетайте const с глобальной переменной, чтобы создать общую константу, которую никто не сможет изменить.
#include <stdio.h>
const int MAX_USERS = 50;
int main(void) {
printf("MAX_USERS = %d\n", MAX_USERS);
return 0;
}Практический шаблон
Глобальное значение конфигурации, которое читают несколько функций, — распространённый и допустимый вариант использования.
#include <stdio.h>
int multiplier = 3;
int scale(int x) { return x * multiplier; }
int main(void) {
printf("%d\n", scale(4));
printf("%d\n", scale(7));
return 0;
}Быстрая проверка
Проверьте своё понимание extern и глобальных переменных.
Итоги: extern и глобальные переменные
Вы узнали о глобальных переменных и внешнем связывании.
- Глобальные переменные имеют область видимости файла и существуют всю программу
- По умолчанию они получают значение 0 и доступны всем функциям
externобъявляет глобальную переменную, определённую в другом месте- Определение выделяет память, а объявление только сообщает имя
- Используйте глобальные переменные умеренно, чтобы избежать скрытой связанности
Часто задаваемые вопросы
Урок «extern и глобальные переменные» бесплатный?
Да — полный текст урока «extern и глобальные переменные» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.
Чему я научусь в уроке «extern и глобальные переменные»?
Общий доступ между файлами Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C Academy?
Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «extern и глобальные переменные»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C Academy?
Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- auto и локальная область видимости
- static-переменные
- extern и глобальные переменные
- register и const