Справочник от Автор24
Найди эксперта для помощи в учебе
Найти эксперта
+2

Extern и глобальные переменные

Определение 1

Extern и глобальные переменные — это внешние переменные, которые могут быть доступны из любой программной области.

Введение

Необходимо прежде всего отметить, что в языках программирования С и С++ имеется незначительное, но, тем не менее, имеющее значение, отличие в значениях терминов «объявление» и «определение».

Когда выполняется объявление переменой или функции, это означает сообщение компилятору о наличии чего-то с конкретным именем и определённым типом. Компилятор способен перерабатывать почти все применения данного имени, без требования подробного описания этого имени. Объявление значения без его определения, даёт возможность написания кода, который понятен компилятору без конкретизации добавочных деталей. Это важно, если ведётся работа с некоторым количеством исходных файлов и некоторые из них будут применять эту функцию. То есть программисту можно не расписывать тело функции в каждом файле, но требуется её объявление.

Приведём пример:

	int func();

Здесь объявлена функция, но не расписано её содержание, то есть тело. Но это сообщение программе компиляции, что можно применять данную функцию, и следует полагать, что позже она определится. Определение чего-либо предполагает указание всех необходимых данных для формирования этого полностью. То есть, определение функции должно означать написание её тела, а назначение класса должно означать описание всех методик и полей класса. Но когда что-либо уже определено, оно должно также считаться объявленным. То есть программисту допускается как объявление так определение функций, классов или переменных одновременно. К примеру, компилятору обычно хватает объявления. Имеем следующий код:

Псевдокод. Автор24 — интернет-биржа студенческих работ

Рисунок 1. Псевдокод. Автор24 — интернет-биржа студенческих работ

«Extern и глобальные переменные» 👇
Помощь эксперта по теме работы
Найти эксперта
Решение задач от ИИ за 2 минуты
Решить задачу
Помощь с рефератом от нейросети
Написать ИИ

Поскольку компилятору известно возвращаемое значение функции и число принимаемых ею аргументов, то возможно выполнить компиляцию вызова функции и в том случае, когда она ещё не определялась. Ведь определить функцию возможно и в другом файле. Аналогично возможно объявление класса без его определения:

	class MyClass;

Но при формировании кода программы уже будет необходимо знать подробности, которых нет в определении. Например:

Псевдокод. Автор24 — интернет-биржа студенческих работ

Рисунок 2. Псевдокод. Автор24 — интернет-биржа студенческих работ

Здесь компилятору уже необходим размер переменной an_object, которого нет в объявлении MyClass., но определение даётся ниже.

Межмодульные переменные

Предположим, что имеется пара модулей A.c и B.c. При этом модуль А содержит определение, помимо всех функций, целой переменной:

 ìnt ì = 2;
Замечание 1

Переменные такого типа именуются глобальными. Эта переменная доступна в файле А от момента её определения и до окончания файла. Но в программном модуле В данная переменная недоступна. Разрешить проблему поможет команда extern.

Глобальные переменные с Extern

Термин Extern применяется для указания на глобальную переменную или как шаблон, который показывает, что данное имя обладает внешней компоновкой. Термин extern является ключевым словом, которое может иметь следующие значения, зависящие от контекста:

  1. Если объявляется переменная, которая не является константой, extern показывает, что данная функция или переменная будет определена в другом месте. Extern необходимо использовать во всех файлах, кроме того, в котором выполняется определение этой переменной.
  2. Если объявляется переменная const, extern определяет, что константа обладает внешней компоновкой. Extern необходимо указывать во всех объявлениях во всех исходных файлах, поскольку глобальные переменные const заявлены по умолчанию с внутренним расположением.
  3. Выражение extern «C» означает, что определение функции сделано в другом месте и применяет условия вызова языка Си. Модификаторы extern «C» возможно применять к некоторому количеству объявлений функций в программном блоке.
  4. Если объявляется шаблон, то extern означает, что шаблон уже сформирован в другом месте. Это позволяет оптимизировать работу компилятора, путём повторного использования этого шаблона, а не создания нового.

Если программа компоновщика выявляет extern ещё до того, как была объявлена глобальная переменная, она будет выполнять поиск определения этой переменной в других записях. Все глобальные переменные, которые не являются константами, по умолчанию считаются внешними. Практически всегда при объявлении переменной выполняется и её определение. Фактически определение переменной означает указание компилятору, в каком месте следует выделить место под данную переменную. К примеру, такая запись:

	ìnt x;
ìnt maìn()
{
 x = 3;
}

Здесь строчка ìnt x выполняет и объявление, и определение переменной. Она сообщает компилятору, что требуется сформировать переменную по имени х, с типом int. Помимо этого, определяется место сохранения переменной как глобальной, определённой в объектном файле, который связан с данным исходным файлом. Применение функции extern даёт возможность объявления переменной без её определения. Она указывает, что сама переменная расположена в каком-либо ином месте. Приведём пример:

	extern ìnt x;
ìnt func()
{
 x = 3;
}
 
ìnt x;

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

 redefìnition of ‘foo.

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

Дата написания статьи: 10.01.2020
Найди решение своей задачи среди 1 000 000 ответов
Крупнейшая русскоязычная библиотека студенческих решенных задач
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot