Extern int что это

Extern в C++

Слово «extern» в C ++ является спецификатором. Его использование в C ++ объясняется в этой статье для переменных и функций. Сначала дается значение объявления и определения в C ++. Рассмотрим следующие строки кода:

char fn ( int itg, char ch ) ;

char fn ( int itg, char ch ) <
char var = ‘o’ ;
if ( itg == 1 && ch == ‘a’ )
var = ‘z’ ;
return var ;
>

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

В C ++ есть нюанс, когда речь идет об объявлении и определении. Следующий оператор является объявлением переменной:

Подобное полное объявление переменной, в котором переменная вводится, а затем ей присваивается значение, остается объявлением переменной. Итак, объявление переменной может просто вводить переменную или вводить ее вместе с определением.

Следующий код (скопированный сверху) является объявлением функции:

Полное объявление функции, подобное этому, где его подпись вводит функцию, а затем следует тело функции, по-прежнему является объявлением функции. Итак, объявление функции может быть только прототипом функции или может быть сигнатурой функции вместе с телом функции.

Итак, объявление может быть с определением или без него. Определение похоже на часть объявления. Для переменной присвоение значения в первый раз фактически является инициализацией, а не определением. Когда переменная объявляется впервые без инициализации, ее местоположение в памяти уже указано, но оно пустое. Установка значения в этом месте — это инициализация, завершающая определение.

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

Заголовочный файл без внешнего

Традиционно простое приложение C ++ имеет три файла: основной файл с функцией main (), которую можно назвать первым файлом, второй файл и файл заголовка. Заголовочный файл должен содержать объявления переменных и функций без их определений. Определения объявлений заголовков должны быть во втором файле. Вверху первого файла должно быть,

Где head.hh — это имя файла заголовка, который находится в домашнем каталоге пользователя. Директива include не заканчивается точкой с запятой. В этой ситуации объявлениям переменных без определений и прототипам функций без определений функций в файле заголовка не должен предшествовать спецификатор extern. И приложение должно работать.

Illustration

Указанные выше переменная и функция используются здесь для иллюстрации.

Введите следующий код в текстовом редакторе и сохраните его в домашнем каталоге пользователя с именем head.hh:

int it = 5 ;
char fn ( int itg, char ch ) ;

В заголовке всего два утверждения. Затем введите следующее в безымянный документ текстового редактора и сохраните в домашнем каталоге пользователя с именем second.cpp:

Затем введите следующий код в другой безымянный документ текстового редактора и сохраните его в домашнем каталоге пользователя с именем first.CPP:

Скомпилируйте приложение с помощью следующей команды терминала:

Запустите приложение с помощью,

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

extern без файла заголовка

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

Illustration

Введите следующий код в текстовом редакторе и сохраните его в домашнем каталоге пользователя с именем first.cpp:

extern char fn ( int itg, char ch ) ;

Затем введите следующее в безымянный документ текстового редактора и сохраните в домашнем каталоге пользователя с именем second.cpp:

char fn ( int itg, char ch ) <
char var = ’о’ ;
если ( itg == 1 && ch == ’a’ )
var = ’z’ ;
return var ;
>

Определение переменной и функции произошло во втором файле. В первом файле они были объявлены без определения. В это новое приложение не был включен заголовок. Задействованы только два файла. Обратите внимание, что переменная полностью объявлена ​​во втором файле, но без слова extern. Даже функция также была объявлена ​​полностью без слова extern. Однако слово «extern» должно предшествовать частичным объявлениям в первом файле.

Скомпилируйте приложение с помощью следующей команды терминала:

Запустите приложение с помощью,

То же, что и раньше, но без заголовочного файла.

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

Заголовочный файл и внешний

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

Источник

Урок №49. Глобальные переменные

Обновл. 24 Сен 2021 |

Мы уже знаем, что переменные, объявленные внутри блока, называются локальными. Они имеют локальную область видимости (используются только внутри блока, в котором объявлены) и автоматическую продолжительность жизни (создаются в точке определения и уничтожаются в конце блока).

Глобальными называются переменные, которые объявлены вне блока. Они имеют статическую продолжительность жизни, т.е. создаются при запуске программы и уничтожаются при её завершении. Глобальные переменные имеют глобальную область видимости (или «файловую область видимости»), т.е. их можно использовать в любом месте файла, после их объявления.

Определение глобальных переменных

Обычно глобальные переменные объявляют в верхней части кода, ниже директив #include, но выше любого другого кода. Например:

Подобно тому, как переменные во внутреннем блоке скрывают переменные с теми же именами во внешнем блоке, локальные переменные скрывают глобальные переменные с одинаковыми именами внутри блока, в котором они определены. Однако с помощью оператора разрешения области видимости ( :: ), компилятору можно сообщить, какую версию переменной вы хотите использовать: глобальную или локальную. Например:

Результат выполнения программы:

Global value: 3
Local value: 9

Ключевые слова static и extern

В дополнение к области видимости и продолжительности жизни, переменные имеют еще одно свойство — связь. Связь переменной определяет, относятся ли несколько упоминаний одного идентификатора к одной и той же переменной или нет.

Переменная без связей — это переменная с локальной областью видимости, которая относится только к блоку, в котором она определена. Это обычные локальные переменные. Две переменные с одинаковыми именами, но определенные в разных функциях, не имеют никакой связи — каждая из них считается независимой единицей.

Переменная, имеющая внутренние связи, называется внутренней переменной (или «статической переменной»). Она может использоваться в любом месте файла, в котором определена, но не относится к чему-либо вне этого файла.

Переменная, имеющая внешние связи, называется внешней переменной. Она может использоваться как в файле, в котором определена, так и в других файлах.

Если вы хотите сделать глобальную переменную внутренней (которую можно использовать только внутри одного файла) — используйте ключевое слово static:

Источник

Какова концепция использования extern в c / c ++?

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

как я пробовал некоторые коды следующим образом:

и если я использую некоторый код как:

Это не показывает никакой ошибки и дает значение, такое же, как я определил в основной функции.

Решение

extern используется для ссылки на переменную в другом модуле перевода («исходный файл»).
Например, ваш код в main.c выглядит так:

Этот код содержит объявление для целого числа с именем var, но без определения, потому что extern явно говорит: «определение для этого где-то еще»

Вы можете определить другой исходный файл, скажем, other.c:

Затем, после добавления этого нового модуля перевода в команду сборки, ваша программа будет нормально связываться, и код в обоих файлах может работать с общим var переменная.

Во второй версии вы просто переопределяете объявление extern var с локальной переменной в вашей главной функции. С экстерьера var больше не используется (ODR-), компоновщик не требует его, поэтому ваш исполняемый файл может успешно собираться.

Другие решения

в его глобальном масштабе.

extern используется, чтобы указать, что переменная существует в другом модуле компиляции. Если у тебя есть:

main.cpp

var.cpp

Тогда вы не получили бы ошибку компоновщика, так как компоновщик подключил бы использование var в main.cpp с его объявлением в var.cpp

Во втором примере вы определили extern int var но вы никогда не ссылаетесь на это. int var = 10 это совершенно другой int var от внешнего. Когда запускается компоновщик, он замечает, что вы никогда не используете extern int var переменная, поэтому не надо искать его.

Я хотел бы предложить вам очистить ваше понимание определения и объявления переменной.

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

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

В первом случае вы просто объявляете переменную, не присваивая ей никакой памяти, т.е. не определяя переменную.

ты можешь пройти этот для лучшего понимания ключевого слова extern.

Если вы объявили глобальную переменную, скажем, double myvar=5 в file1.cpp, и вы хотите получить доступ к этой переменной в file2.cpp, а затем в вашем file2.cpp вы объявляете как

В C ++ каждый файл называется модулем компиляции. Для того чтобы файл был скомпилирован в объектный файл, вам нужно объявить все переменные, однако вам не нужно инициализировать или выполнять присваивание этих переменных.

Возвращаясь к примеру:

File1.cpp: double myvar=5 это и объявление, и инициализация. Вы можете скомпилировать file1.cpp в file1.o.

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

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

Источник

Использование спецификаторов const, volatile и extern.

Extern int что это. Смотреть фото Extern int что это. Смотреть картинку Extern int что это. Картинка про Extern int что это. Фото Extern int что это

Extern int что это. Смотреть фото Extern int что это. Смотреть картинку Extern int что это. Картинка про Extern int что это. Фото Extern int что это

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

Квалификатор типа const.

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

В принципе это основное применение спецификатора const, поэтому, думаю, нет смысла углубляться, так что идем дальше.

Квалификатор типа volatile.

Этот замечательный спецификатор позволяет нам использовать переменную, значение которой может изменяться неявно в процессе выполнения программы. Что же это значит? А вот пример:

Так как наша переменная test нигде явно не изменяется (то есть не стоит слева от оператора присваивания) то заботливый компилятор в результате оптимизации прочитает ее значение только один раз и больше не станет, переменная то на его взгляд нигде не изменяется! А эта переменная на самом деле может принять другое значение в результате выполнения другого потока, либо изменить свое значение неявно в прерывании. А это уже катастрофа! И для того, чтобы ее предотвратить как раз и используется спецификатор volatile. То есть объявить нашу переменную мы должны так:

Спецификатор класса памяти extern.

Если программа состоит из нескольких файлов, как почти всегда и бывает, то без ключевого слова extern не обойтись. Пусть в разных файлах используется одна и та же переменная x. Значит каждый файл должен знать о существовании этой переменной, но просто объявить переменную во всех файлах не прокатит — компилятор этого не допустит. Тут то и придет на помощь спецификатор extern. Вот пример: пусть программа состоит из двух файлов, в каждом из которых есть функции, использующий переменную x:

При таком объявлении переменной ошибки не будет и все скомпилируется успешно.

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

Вот собственно и все 🙂 Получилась небольшая памятка, которая позволит сразу же и без проблем разобраться с этими ключевыми словами без путаницы.

Источник

Зачем нужен extern?

Extern int что это. Смотреть фото Extern int что это. Смотреть картинку Extern int что это. Картинка про Extern int что это. Фото Extern int что этоЗачем нужен dynamic_cast?
Point * mas; mas = new Point(); mas = new Square(); mas = new Circle();.

Объяснить зачем нужен i
#include #include using namespace std; int main() < cout 10

Нет. переменная а с этого момента уже определена, но не инициализирована, ее значение задано по умолчанию.
Посмотрите в окне отладчика.

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

Функции по дефолту extern.

Поправочка: В этом случае компоновщик выдаст сообщение.

Добавлено через 48 секунд

Вам сюда: Используете ли вы глобальные переменные свежак Extern int что это. Смотреть фото Extern int что это. Смотреть картинку Extern int что это. Картинка про Extern int что это. Фото Extern int что это

Добавлено через 2 минуты

Если объявления нет, тогда компилятор не будет знать что это такое вообще,
никакие определения искать не будет, тем более,
выдавать ошибки о том, что определение не найдено.
Он будет ругаться на отсутствие объявления.

P.S. Выше я немного не так выразился, возможно несколько не понятно Extern int что это. Смотреть фото Extern int что это. Смотреть картинку Extern int что это. Картинка про Extern int что это. Фото Extern int что это

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *