Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Классы хранения в C: auto, extern, static, register — подробное объяснение

Что такое класс хранения в C?

Класс хранения определяет область видимости переменной, ее расположение, инициализацию, время жизни и доступность. В C каждая переменная не только типизирована, но также назначается ей класс хранения, определяющий, где и как к ней можно получить доступ.

Существует четыре стандартных класса хранения:

Класс хранения auto

Переменные, объявленные с auto (по умолчанию для локальных переменных), существуют только внутри блока, где они определены. Они уничтожаются при выходе из блока и инициализируются неопределенным значением, если не заданы явно.

int add(void) { int a = 13; auto int b = 48; // auto опционален return a + b; }

Демонстрация области видимости:

#include <stdio.h> int main(void) { auto int j = 1; { auto int j = 2; { auto int j = 3; printf("%d ", j); // печатает 3 } printf("\t%d ", j); // печатает 2 } printf("%d\n", j); // печатает 1 }

Вывод: 3 2 1

Класс хранения extern

Ключевое слово extern объявляет переменную или функцию, определенную в другой единице трансляции. Оно обеспечивает обмен данными между исходными файлами.

/* main.c */ #include <stdio.h> extern int i; // объявление int main(void) { printf("value of the external integer is = %d\n", i); return 0; } /* original.c */ #include <stdio.h> int i = 48; // определение 

Скомпилируйте оба файла вместе: gcc main.c original.c -o program. Запуск ./program выводит:

value of the external integer is = 48

Класс хранения static

Статические переменные сохраняют свое значение на протяжении всей программы. Они могут использоваться как локальные статические или файловые статические.

/* глобальный static */ static int counter = 7; void next(void) { /* локальный static */ static int iteration = 13; iteration++; printf("iteration=%d and counter=%d\n", iteration, counter); } int main(void) { while (counter < 10) { next(); counter++; } return 0; } 

Вывод:

iteration=14 and counter=7 iteration=15 and counter=8 iteration=16 and counter=9

Класс хранения register

Используйте register, когда переменной нужен частый доступ и она помещается в регистр процессора. Компилятор может игнорировать подсказку, если регистры заняты.

#include <stdio.h> int main(void) { register int weight; /* попытка взять адрес вызывает ошибку */ // int *ptr = &weight; // ошибка компиляции return 0; }

Компиляция кода дает:

error: address of register variable 'weight' requested

Сводная таблица

Класс храненияКонтекст объявленияМесто храненияЗначение по умолчаниюОбласть видимостиВремя жизни
autoвнутри функции/блокаПамятьНепредсказуемоеФункция/блокФункция/блок
registerвнутри функции/блокаРегистр CPUНепредсказуемоеФункция/блокФункция/блок
externвне всех функцийПамятьНольВся программаВремя выполнения программы
static (local)внутри функции/блокаПамятьНольФункция/блокВремя выполнения программы
static (global)вне всех функцийПамятьНольФайлВремя выполнения программы

Ключевые выводы

Язык C

  1. Классы и объекты в C#: Фундаменты надёжного ООП
  2. Ключевое слово static в C#: статические переменные, методы и классы
  3. Вложенные классы в C#: определение, использование и наследование
  4. Классы и объекты в C++: практическое руководство по объектно-ориентированному программированию
  5. Дружественные функции и классы в C++: мастерство контроля доступа
  6. Шаблоны классов в C++: практическое руководство
  7. Классы хранения в C: область видимости, время жизни и производительность
  8. Классы хранения в C: auto, register, static, extern — область видимости и время жизни
  9. Классы хранения в C++: область видимости, время жизни и использование
  10. Интерфейсы в C++: абстрактные классы и чисто виртуальные функции