Внешняя переменная

редактировать

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

В качестве альтернативы автоматическим переменным можно определить переменные, которые являются внешними по отношению ко всем функциям, то есть переменные, к которым любая функция может получить доступ по имени. (Этот механизм скорее похож на переменные Fortran COMMON или Pascal, объявленные во внешнем блоке.) Поскольку внешние переменные доступны глобально, их можно использовать вместо списков аргументов для передачи данных между функциями. Более того, поскольку внешние переменные существуют постоянно, а не появляются и исчезают при вызове и выходе из функций, они сохраняют свои значения даже после того, как функции, которые их установили, вернулись.

Язык программирования C
Содержание
  • 1 Определение, объявление и ключевое слово extern
  • 2 Область действия, время жизни и ключевое слово static
  • 3 Пример (язык программирования C)
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки
Определение, объявление и ключевое слово extern

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

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

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

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

Внешняя переменная должна быть определена ровно один раз вне какой-либо функции; это выделяет место для хранения. Переменная также должна быть объявлена ​​в каждой функции, которая хочет получить к ней доступ; это указывает тип переменной. Объявление может быть явным оператором externили может быть неявным из контекста.... Обратите внимание, что мы внимательно используем слова определение и объявление, когда говорим о внешних переменных в этом разделе. Определение относится к месту, где переменная создается или назначается хранилище; объявление относится к местам, где указывается характер переменной, но не выделяется память.

Язык программирования C
Область действия, время жизни и ключевое слово static

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

Ключевое слово static (staticи externисключают друг друга), применяемое к определению внешней переменной, немного меняет это: к переменной могут обращаться только функции в том же модуле, где она была определена. Но функция в том же модуле может передать ссылку (указатель) на переменную другой функции в другом модуле. В этом случае, даже если функция находится в другом модуле, она может читать и изменять содержимое переменной - она ​​просто не может ссылаться на нее по имени.

Также можно использовать ключевое слово staticв определении локальной переменной. Без ключевого слова staticпеременная автоматически выделяется при вызове функции и освобождается при выходе из функции (отсюда и название «автоматическая переменная»). Его значение не сохраняется между вызовами функций. С ключевым словом staticпеременная выделяется при запуске программы и освобождается при ее завершении. Его значение не теряется между вызовами функций. Переменная по-прежнему является локальной, поскольку к ней можно получить доступ только по имени внутри функции, которая ее определила. Но ссылку (указатель) на нее можно передать другой функции, позволяя ей читать и изменять содержимое переменной (опять же, без ссылки на нее по имени).

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

Если инициализация не выполняется явно, внешние (статические или нет) и локальные статические переменные инициализируются нулем. Локальные автоматические переменные не инициализированы, т.е. содержат "мусорные" значения.

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

Пример (язык программирования C)

Файл 1:

// Явное определение, это фактически выделяет //, а также описывает int Global_Variable; // Прототип функции (объявление), предполагается, // что он определен где-то еще, обычно из включаемого файла. void SomeFunction (недействителен); int main (void) {Global_Variable = 1; SomeFunction (); возврат 0; }

Файл 2:

// Неявное объявление, это только описывает и // предполагает выделение в другом месте, обычно из include extern int Global_Variable; // Заголовок функции (определение) void SomeFunction (void) {++ Global_Variable; }

В этом примере переменная Global_Variable определена в файле 1. Чтобы использовать ту же переменную в файле 2, ее необходимо объявить. Независимо от количества файлов глобальная переменная определяется только один раз; однако он должен быть объявлен в любом файле, кроме того, который содержит определение.

Если программа находится в нескольких исходных файлах, и переменная определена в file1 и используется в file2 и file3, тогда объявления extern необходимы в file2 и file3 для соединения вхождений переменной. Обычная практика - собирать внешние объявления переменных и функций в отдельном файле, исторически называемом заголовком, который включается с помощью #include в начало каждого исходного файла. Суффикс.h является обычным для имен заголовков.

Язык программирования C

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

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-19 10:14:17
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте