C Классы хранения
Определения классов хранения определяют место хранения, время жизни и область видимости переменных/функций в программах на C.
Эти спецификаторы размещаются перед типом, который они изменяют.
Ниже перечислены классы хранения, доступные в программах на C:
- auto
- регистр
- static
- extern
auto класс памяти
autoЭтот класс хранения является классом хранения по умолчанию для всех локальных переменных.
Переменные, определённые в функции, по умолчанию относятся к классу памяти auto, то есть создаются при запуске функции и уничтожаются при её завершении.
{
int mount;
auto int month;
}
В приведённом выше примере определяются две переменные с одним и тем же классом памяти. auto можно использовать только внутри функции, то есть auto может изменять только локальные переменные.
класс памяти register
registerЭтот класс памяти используется для определения локальных переменных, хранящихся в регистрах, а не в ОЗУ. Это означает, что максимальный размер переменной равен размеру регистра (обычно одному слову), и к ней нельзя применить унарный оператор '&' (поскольку у неё нет ячейки памяти).
Класс памяти register определяет хранение в регистрах, поэтому доступ к переменной быстрее, но к ней нельзя обратиться напрямую, поскольку она не хранится в ОЗУ. Использование класса памяти register для переменных, к которым требуется частый доступ, может повысить скорость работы программы.
{
register int miles;
}
Регистры используются только для переменных, требующих быстрого доступа, например счётчиков. Следует также отметить, что определение 'register' не означает, что переменная будет храниться в регистре; это означает, что переменная может храниться в регистре, в зависимости от аппаратных ограничений и ограничений реализации.
static класс памяти
staticЭтот класс памяти указывает компилятору сохранять локальную переменную существующей в течение всего времени жизни программы, без необходимости создавать и уничтожать её каждый раз при входе в её область видимости и выходе из неё. Поэтому использование static для изменения локальной переменной позволяет сохранять значение локальной переменной между вызовами функции.
Модификатор static также можно применять к глобальным переменным. Когда static изменяет глобальную переменную, он ограничивает область видимости переменной файлом, в котором она объявлена.
Глобально объявленная статическая переменная или метод могут быть вызваны любой функцией или методом, если эти методы находятся в том же файле, что и статическая переменная или метод.
Статическая переменная инициализируется в программе только один раз. Даже если функция вызывается несколько раз, значение переменной не будет сброшено.
Следующий пример демонстрирует применение static для изменения глобальных и локальных переменных:
Пример
В примере count — это глобальная переменная, которую можно использовать внутри функций; после того как thingy модифицируется с помощью static, она не будет сбрасываться при каждом вызове.
Вы можете ещё не понимать этот пример, потому что я уже использовал функции и глобальные переменные — две концепции, которые до сих пор не объяснялись. Даже если сейчас вы не можете полностью понять его, это не имеет значения; мы подробно объясним это в следующих главах. Когда приведённый выше код скомпилирован и выполнен, он выдаёт следующие результаты:
thingy 为 6 , count 为 9 thingy 为 7 , count 为 8 thingy 为 8 , count 为 7 thingy 为 9 , count 为 6 thingy 为 10 , count 为 5 thingy 为 11 , count 为 4 thingy 为 12 , count 为 3 thingy 为 13 , count 为 2 thingy 为 14 , count 为 1 thingy 为 15 , count 为 0
extern класс памяти
externЭтот класс памяти используется для определения глобальных переменных или функций, объявленных в других файлах. Когда используется ключевое слово extern, для переменной не выделяется память; оно лишь сообщает компилятору, что переменная определена в другом файле.
externЭтот класс памяти используется для предоставления ссылки на глобальную переменную, видимую всем файлам программы. Когда вы используетеextern, для переменной, которую нельзя инициализировать, он привязывает имя переменной к ранее определённому месту хранения.
Когда у вас есть несколько файлов и вы определяете глобальную переменную или функцию, которые можно использовать в других файлах, вы можете использоватьexternв других файлах, чтобы получить ссылку на определённую переменную или функцию. Это можно понимать так:externиспользуется для объявления глобальной переменной или функции в другом файле.
Модификатор extern обычно используется, когда два или более файлов совместно используют одну и ту же глобальную переменную или функцию, как показано ниже:
Первый файл: main.c
Пример
Второй файл: support.c
Пример
Здесь, во втором файле,externКлючевое слово используется для объявления переменной, уже определённой в первом файле main.ccount. Теперь скомпилируйте эти два файла следующим образом:
$ gcc main.c support.c
Это создастa.outисполняемую программу; при выполнении программа выдаёт следующие результаты:
count is 5Другие расширения