Поделиться через


Спецификатор класса хранения 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.

См. также

Спецификаторы классов хранения для объявлений внутреннего уровня