Рубрики

Понимание ключевого слова extern в C

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

Хотя (почти) каждый знает значение объявления и определения переменной / функции для полноты этого поста, я хотел бы прояснить их. Объявление переменной / функции просто объявляет, что переменная / функция существует где-то в программе, но память для них не выделена. Но объявление переменной / функции играет важную роль. И это тип переменной / функции. Поэтому, когда переменная объявлена, программа знает тип данных этой переменной. В случае объявления функции программа знает, каковы аргументы этой функции, их типы данных, порядок аргументов и тип возвращаемого значения функции. Так что это все о декларации. Что касается определения, когда мы определяем переменную / функцию, помимо роли объявления, она также выделяет память для этой переменной / функции. Поэтому мы можем думать об определении как о надмножестве объявления. (или объявление в качестве подмножества определения). Из этого объяснения должно быть очевидно, что переменная / функция может быть объявлена любое количество раз, но она может быть определена только один раз. (Помните основной принцип, что у вас не может быть двух местоположений одной и той же переменной / функции). Так что это все о декларации и определении.

Теперь вернемся к нашей главной цели: Понимание ключевого слова «extern» на языке C. Я объяснил роль объявления / определения, потому что необходимо понимать их, чтобы понимать ключевое слово «extern». Давайте сначала рассмотрим простой случай. Использование extern с функциями C. По умолчанию к объявлению и определению функции C добавлен «extern». Это означает, что хотя мы не используем extern с объявлением / определением функций C, он присутствует там. Например, когда мы пишем.

    int foo(int arg1, char arg2);

В начале есть внешний элемент, который скрыт, и компилятор обрабатывает его, как показано ниже.

    extern int foo(int arg1, char arg2);

То же самое имеет место с определением функции C (определение функции C означает написание тела функции). Поэтому всякий раз, когда мы определяем функцию C, в начале определения функции там присутствует extern. Поскольку объявление может быть сделано любое количество раз, а определение может быть выполнено только один раз, мы можем заметить, что объявление функции может быть добавлено в несколько файлов C / H или в один файл C / H несколько раз. Но мы замечаем фактическое определение функции только один раз (т.е. только в одном файле). И так как extern расширяет видимость всей программы, функции можно использовать (вызывать) в любом месте любого файла всей программы, если известно объявление функции. (Зная объявление функции, компилятор C знает, что определение функции существует, и он собирается скомпилировать программу). Так что это все о extern с функциями C.

Теперь давайте возьмем второй и последний случай, т.е. использование extern с C-переменными. Я чувствую, что это более интересно и информативно, чем предыдущий случай, когда extern присутствует по умолчанию с функциями C. Итак, позвольте мне задать вопрос, как бы вы объявили переменную C без ее определения? Многие из вас сочли бы это тривиальным, но это важный вопрос для понимания extern с C-переменными. Ответ состоит в следующем.

    extern int var;

Здесь была объявлена переменная целочисленного типа var (не помню определения, т.е. пока нет выделения памяти для var). И мы можем сделать это заявление столько раз, сколько необходимо. (помните, что объявление может быть сделано любое количество раз) Пока все хорошо. 🙂

Теперь, как бы вы определили переменную? Теперь я согласен, что это самый тривиальный вопрос в программировании, и ответ таков.

    int var;

Здесь переменная целочисленного типа с именем var была объявлена так же, как и определена. (помните, что определение является надмножеством объявления). Здесь также выделяется память для var. Теперь наступает сюрприз, когда мы объявили / определили функцию C, мы увидели, что extern присутствует по умолчанию. При определении функции мы можем без проблем добавить ее к extern. Но это не так с C переменными. Если мы поместим наличие extern в переменную по умолчанию, тогда память для них никогда не будет выделяться, они будут объявлены только. Поэтому мы явно указываем extern для переменных C, когда хотим объявить их, не определяя их. Кроме того, поскольку extern расширяет видимость всей программы, используя ключевое слово extern с переменной, мы можем использовать переменные в любом месте программы, если мы знаем их объявление и где-то определена переменная.

Теперь давайте попробуем понять extern с помощью примеров.

Пример 1:

int var;

int main(void)

{

   var = 10;

   return 0;

}

Анализ: Эта программа успешно скомпилирована. Здесь var определяется (и объявляется неявно) глобально.

Пример 2:

extern int var;

int main(void)

{

  return 0;

}

Анализ: Эта программа успешно скомпилирована. Здесь объявлен только var. Обратите внимание, что var никогда не используется, поэтому никаких проблем не возникает.

Пример 3:

extern int var;

int main(void)

{

  var = 10;

  return 0;

}

Анализ: эта программа выдает ошибку при компиляции. Потому что var объявлен, но нигде не определен. По сути, VAR не выделяется никакой памяти. И программа пытается изменить значение на 10 переменной, которая вообще не существует.

Пример 4:

#include "somefile.h"

extern int var;

int main(void)

{

 var = 10;

 return 0;

}

Анализ: Предположим, что somefile.h имеет определение var. Эта программа будет успешно скомпилирована.

Пример 5:

extern int var = 0;

int main(void)

{

 var = 10;

 return 0;

}

Анализ: Угадай, эта программа будет работать? Ну, вот еще один сюрприз от стандартов Си. Они говорят, что … если переменная только объявлена и инициализатору также предоставлено это объявление, то память для этой переменной будет выделена, т.е. эта переменная будет считаться определенной. Поэтому, согласно стандарту C, эта программа успешно скомпилируется и будет работать.

Так что это был предварительный взгляд на ключевое слово «extern» в C.

Я уверен, что вы хотите что-то отнять от прочтения этого поста. И я бы тебя не разочаровал. 🙂
Короче можно сказать

1. Объявление может быть сделано любое количество раз, но определение только один раз.
2. Ключевое слово «extern» используется для расширения видимости переменных / функций ().
3. Так как функции видны во всей программе по умолчанию. Использование extern не требуется в объявлении / определении функции. Его использование является излишним.
4. Когда extern используется с переменной, он объявляется только как не определенный.
5. В качестве исключения, когда внешняя переменная объявляется с инициализацией, она также принимается за определение переменной.

Рекомендуемые посты:

Понимание ключевого слова extern в C

0.00 (0%) 0 votes