extern
- класс хранения в C. Как именно он работает? Вывод кода, приведенного ниже, равен 20. Как это результат?Как работает extern?
#include <stdio.h>
int main()
{
extern int a;
printf("%d", a);
return 0;
}
int a=20;
extern
- класс хранения в C. Как именно он работает? Вывод кода, приведенного ниже, равен 20. Как это результат?Как работает extern?
#include <stdio.h>
int main()
{
extern int a;
printf("%d", a);
return 0;
}
int a=20;
Это означает три вещи:
extern
, либо с инициализатором, либо в вашем случае, оба).В частности, ваш extern int a;
заявляет, что переменная существует, но не определяет ее в этой точке. На этом этапе вы можете использовать его, и компоновщик будет убедиться, что ваше использование относится к определению. Тогда у вас есть необходимое определение, int a=20;
в конце, так что все хорошо.
Вы используете extern
, чтобы сообщить компилятору, что переменная определена в другом месте. Без extern
в вашем компиляторе программы будет определена другая переменная a
(в дополнение к этому в глобальной области) в вашей функции main()
, которая будет напечатана неинициализированной.
extern означает, что я объявляю переменную, точно так же, как вы реализуете функцию в исходном файле и объявляете прототип в заголовке, чтобы разрешить использовать другой исходный файл.
Если вы поместите глобальную переменную в исходный файл и используете заголовок для объявления с ключевым словом extern, каждый исходный файл, включая заголовок, увидит переменную.
Компоновщик будет делать эту работу, чтобы связать все так же, как это делает с функциями
extern
в этом случае указывает, что символ a
определяется в другом месте, например, в другом модуле. Таким образом, компоновщик ищет символ с тем же именем во всех связанных с ним модулях, и если он существует, он устанавливает адрес в вашу локальную переменную a
с адресом внешней переменной. Поскольку у вас есть другой a
, определенный за пределами вашей функции main()
, a
внутри вашей функции main()
(в основном) та же переменная, что и внешняя.
Поскольку глобальный a
инициализирован до выполнения основной функции, значение равно 20 к моменту его доступа.
extern
как спецификатор класса хранения сообщает компилятору, что объявляемый объект не является новым объектом, но имеет место хранения в другом месте, то есть определен в другом месте. Вы можете попробовать этот эксперимент с вашим кодом, чтобы узнать, как он работает. Оставьте ключевое слово extern
в своем объявлении int a
в main()
. Затем ваш printf()
напечатает некоторое количество мусора, так как это будет новое определение int
с тем же идентификатором, который скроет глобальный a
, объявленный в другом месте.
Что вы ожидали от этого? –
Как насчет гуглинга? –
@OliCharlesworth Я думал, что это будет 0, поскольку внешняя переменная автоматически назначается 0. –