2013-08-26 4 views
2

extern - класс хранения в C. Как именно он работает? Вывод кода, приведенного ниже, равен 20. Как это результат?Как работает extern?

#include <stdio.h> 

int main() 
{ 
    extern int a; 
    printf("%d", a); 
    return 0; 
} 
int a=20; 
+2

Что вы ожидали от этого? –

+1

Как насчет гуглинга? –

+0

@OliCharlesworth Я думал, что это будет 0, поскольку внешняя переменная автоматически назначается 0. –

ответ

10

Это означает три вещи:

  • переменная имеет внешних связей и доступна из любого места в программе;
  • Он имеет статический срок хранения, поэтому его срок службы - это программа (более или менее); и
  • Декларация - это просто декларация, а не определение. Переменная также должна быть определена где-нибудь (либо без extern, либо с инициализатором, либо в вашем случае, оба).

В частности, ваш extern int a; заявляет, что переменная существует, но не определяет ее в этой точке. На этом этапе вы можете использовать его, и компоновщик будет убедиться, что ваше использование относится к определению. Тогда у вас есть необходимое определение, int a=20; в конце, так что все хорошо.

1

Вы используете extern, чтобы сообщить компилятору, что переменная определена в другом месте. Без extern в вашем компиляторе программы будет определена другая переменная a (в дополнение к этому в глобальной области) в вашей функции main(), которая будет напечатана неинициализированной.

2

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

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

Компоновщик будет делать эту работу, чтобы связать все так же, как это делает с функциями

3

extern в этом случае указывает, что символ a определяется в другом месте, например, в другом модуле. Таким образом, компоновщик ищет символ с тем же именем во всех связанных с ним модулях, и если он существует, он устанавливает адрес в вашу локальную переменную a с адресом внешней переменной. Поскольку у вас есть другой a, определенный за пределами вашей функции main(), a внутри вашей функции main() (в основном) та же переменная, что и внешняя.

Поскольку глобальный a инициализирован до выполнения основной функции, значение равно 20 к моменту его доступа.

2

extern как спецификатор класса хранения сообщает компилятору, что объявляемый объект не является новым объектом, но имеет место хранения в другом месте, то есть определен в другом месте. Вы можете попробовать этот эксперимент с вашим кодом, чтобы узнать, как он работает. Оставьте ключевое слово extern в своем объявлении int a в main(). Затем ваш printf() напечатает некоторое количество мусора, так как это будет новое определение int с тем же идентификатором, который скроет глобальный a, объявленный в другом месте.