Из Википедии, бесплатной энциклопедии
  (Перенаправлено из глобальных переменных )
Перейти к навигации Перейти к поиску

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

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

Используйте [ редактировать ]

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

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

Переменные среды [ править ]

Переменные среды - это возможность, предоставляемая некоторыми операционными системами . В оболочке ОС ( ksh в Unix , bash в Linux , COMMAND.COM в DOS и CMD.EXE в Windows ) они представляют собой своего рода переменную: например, в unix и связанных системах обычная переменная становится переменной среды, когда exportключевое слово используется. Программный код, отличный от оболочек, должен обращаться к ним с помощью вызовов API , таких как getenv()и setenv().

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

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

Только глобальный и глобальный по умолчанию [ править ]

Ряд неструктурированных языков, таких как (ранние версии) BASIC , COBOL и Fortran I (1956), предоставляют только глобальные переменные. Fortran II (1958) представил подпрограммы с локальными переменными и ключевое слово COMMON для доступа к глобальным переменным. Использование COMMON в FORTRAN продолжилось в FORTRAN 77, [1] и повлияло на более поздние языки, такие как PL / SQL. Именованные ОБЩИЕ группы для глобальных объектов ведут себя как структурированные пространства имен. [2] Переменные также являются глобальными по умолчанию в FORTH , Lua , Perl и большинстве оболочек.

По языку [ править ]

C и C ++ [ править ]

В языке C нет global ключевого слова . Однако переменные, объявленные вне функции, имеют «файловую область», что означает, что они видны внутри файла. Переменные, объявленные в области видимости файла, видны между их объявлением и концом единицы компиляции ( .cфайла) (если они не затенены объектом с похожим именем в более близкой области, например локальной переменной); и они неявно имеют внешнюю связь и, таким образом, видны не только .cфайлу или модулю компиляции.содержащие их объявления, но также и со всеми остальными единицами компиляции, которые связаны для формирования полной программы. Однако внешней связи недостаточно для использования такой переменной в других файлах: для того, чтобы модуль компиляции мог правильно обращаться к такой глобальной переменной, ему необходимо знать ее тип. Это достигается объявлением переменной в каждом файле с помощью externключевого слова. (Он будет объявлен в каждом файле, но может быть определен только в одном.) Такие externобъявления часто помещаются в общий файл заголовка, поскольку для всех файлов .c в проекте обычной практикой является включение по крайней мере одного .hфайла: стандарт заголовочный файл errno.hявляется примером, делаяerrnoпеременная, доступная для всех модулей в проекте. Если этот глобальный механизм доступа считается проблематичным, его можно отключить с помощью staticключевого слова, которое ограничивает переменную областью файлов и вызывает попытки импортировать ее, вызывая externошибку компиляции (или связывания). [3]

Пример «глобальной» переменной в C :

#include  <stdio.h>// Это переменная области видимости файла (с внутренней связью), видимая // только в этом модуле компиляции. статический  общий int  = 3 ;  // У этого есть внешняя связь (не ограничиваясь этой единицей компиляции). extern  int  over_shared ;// Также внутренняя ссылка. int  over_shared_too  =  2 ;static  void  ChangeShared ()  {  // Ссылка на переменную области файла в функции.  shared  =  5 ; }static  void  LocalShadow ()  {  // Локальная переменная, которая скроет глобал с тем же именем.  общий int  ; // Это повлияет только на локальную переменную и не повлияет на  переменную // области видимости файла с тем же именем.  shared  =  1000 ; }static  void  ParamShadow ( int  shared )  {  // Это повлияет только на параметр и не повлияет на  переменную // области видимости файла с тем же именем.  shared  =  - общий ; }int  main ()  {  // Ссылка на переменную файловой области. printf ( "% d \ n " ,  общий доступ ); ChangeShared (); printf ( "% d \ n " ,  общий доступ ); LocalShadow (); printf ( "% d \ n " ,  общий доступ ); ParamShadow ( 1 ); printf ( "% d \ n " ,  общий доступ ); возврат  0 ; }

Поскольку переменная является внешней, нет необходимости передавать ее в качестве параметра для использования в функции, кроме main. Он принадлежит каждой функции в модуле.

Результатом будет:

3555

Java [ править ]

Некоторые языки, например Java, не имеют глобальных переменных. В Java все переменные, не являющиеся локальными, являются полями класса. Следовательно, все переменные находятся в области действия класса или метода. В Java статические поля (также известные как переменные класса ) существуют независимо от любых экземпляров класса, и одна копия используется всеми экземплярами; следовательно, общедоступные статические поля используются для многих из тех же целей, что и глобальные переменные в других языках из-за их аналогичного поведения «совместного использования»:

публичный  класс  Global  {  публичный  статический  int  a ; }

PHP [ править ]

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

Однако некоторые предопределенные переменные, известные как суперглобальные переменные, всегда доступны. Все они массивы. Универсальным является $GLOBALSсуперглобальный, который содержит все переменные, определенные вне области действия функции. Изменения в его элементах изменяют исходные переменные, а добавления создают новые переменные. Суперглобальные переменные $_POSTи $_GETшироко используются в веб-программировании.

Другие языки [ править ]

  • В Python и MATLAB глобальную переменную можно объявить где угодно с помощью globalключевого слова. [4] [5]
  • Глобальные переменные Ruby помечаются символом ' $' . Существует ряд предопределенных глобальных переменных, например, идентификатор текущего процесса .$$

См. Также [ править ]

  • Локальная переменная
  • Нелокальная переменная
  • Шаблон синглтона
  • Переменные
    • Статическая переменная
    • Внешняя переменная

Ссылки [ править ]

  1. ^ "Учебное пособие по Fortran 77" .
  2. ^ «Первые шаги: объекты стека и кучи» .
  3. ^ C в двух словах, П.Принц и Т. Кроуфорд, 2006, О'Рейли, глава 11
  4. ^ "Каковы правила для локальных и глобальных переменных в Python?" . docs.python.org . Фонд программного обеспечения Python . Дата обращения 4 июня 2020 .
  5. ^ "Объявить переменные глобальными" . in.mathworks.com . В MathWorks, Inc . Проверено 7 февраля 2015 года .