Спецификатор класса хранения extern
Переменная, объявленная с использованием описателя для класса хранения extern
, представляет собой ссылку на переменную с тем же именем, определенную в другом исходном файле. Она используется, чтобы сделать видимым определение переменной внешнего уровня. Для переменной, объявленной как extern
, не выделено хранилище; по сути, это только имя.
Пример
Этот пример иллюстрирует объявления на внутреннем и внешнем уровнях.
// Source1.c
int i = 1;
// Source2. c
#include <stdio.h>
// Refers to the i that is defined in Source1.c:
extern int i;
void func(void);
int main()
{
// Prints 1:
printf_s("%d\n", i);
func();
return;
}
void func(void)
{
// Address of global i assigned to pointer variable:
static int *external_i = &i;
// This definition of i hides the global i in Source.c:
int i = 16;
// Prints 16, 1:
printf_s("%d\n%d\n", i, *external_i);
}
В этом примере переменная i
определяется в Source1.c с исходным значением 1. Объявление extern
в Source2.c делает "i" видимым в этом файле.
В функции func
адрес глобальной переменной i
используется для инициализации переменной указателя external_i
с описателем static
. Это возможно, поскольку глобальная переменная имеет время существования типа static
, то есть ее адрес не меняется во время исполнения программы. Кроме того, переменная i
определяется в пределах области func
как локальная переменная с исходным значением 16. Это определение не влияет на значение переменной i
внешнего уровня, которое скрыто благодаря использованию соответствующего имени для локальной переменной. Значение глобальной переменной i
теперь доступно только через указатель external_i
.
См. также
Спецификаторы классов хранения для объявлений внутреннего уровня
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по