В компьютерном программировании глобальная переменная — это переменная с глобальной областью действия , что означает, что она видна (следовательно, доступна) во всей программе, если только она не затенена . Набор всех глобальных переменных известен как глобальная среда или глобальное состояние. В компилируемых языках глобальные переменные обычно являются статическими переменными , размер которых (время жизни) равен всему времени выполнения программы, хотя в интерпретируемых языках (включая интерпретаторы командной строки ) глобальные переменные обычно динамически выделяются при объявлении, поскольку они неизвестны. досрочно.
В некоторых языках все переменные являются глобальными или глобальными по умолчанию, в то время как в большинстве современных языков переменные имеют ограниченную область действия, обычно лексическую , хотя глобальные переменные часто доступны путем объявления переменной на верхнем уровне программы. Однако в других языках глобальные переменные не существуют; Обычно это модульные языки программирования, обеспечивающие модульную структуру, или объектно-ориентированные языки программирования на основе классов , обеспечивающие структуру классов.
Механизмы взаимодействия с глобальными переменными называются механизмами глобальной среды (см. также глобальное состояние ). Парадигма глобальной среды контрастирует с парадигмой локальной среды, где все переменные являются локальными и не имеют общей памяти (и, следовательно, все взаимодействия могут быть сведены к передаче сообщений ).
Глобальные переменные широко используются для передачи информации между разделами кода, которые не имеют общего отношения вызывающий/вызываемый объект, например параллельные потоки и обработчики сигналов. Языки (включая C), где каждый файл определяет неявное пространство имен, устраняют большинство проблем, наблюдаемых в языках с глобальным пространством имен , хотя некоторые проблемы могут сохраняться без надлежащей инкапсуляции. Без надлежащей блокировки (например, с помощью мьютекса ) код, использующий глобальные переменные, не будет потокобезопасным, за исключением значений, доступных только для чтения в защищенной памяти .
Переменные среды — это возможность, предоставляемая некоторыми операционными системами . В оболочке ОС ( ksh в Unix , bash в Linux , COMMAND.COM в DOS и CMD.EXE в Windows ) они являются своего рода переменными: например, в unix и родственных системах обычная переменная становится переменной среды, когда ключевое export
слово используется. Программный код, отличный от оболочек, должен получать к ним доступ с помощью вызовов API , таких как getenv()
и setenv()
.
Они локальны для процесса, в котором они были установлены. Это означает, что если мы откроем два окна терминала (два разных процесса, запускающих оболочку) и изменим значение переменной среды в одном окне, это изменение не будет видно в другом окне.
Когда создается дочерний процесс, он наследует все переменные среды и их значения от родительского процесса. Обычно, когда программа вызывает другую программу, она сначала создает дочерний процесс путем разветвления , затем дочерний процесс настраивает среду по мере необходимости и, наконец, дочерний процесс заменяет себя вызываемой программой. Поэтому дочерние процессы не могут использовать переменные среды для связи со своими коллегами, избегая проблемы действий на расстоянии.
Ряд неструктурированных языков , таких как (ранние версии) BASIC , COBOL и Fortran I (1956), предоставляют только глобальные переменные. В Фортране II (1958 г.) были представлены подпрограммы с локальными переменными и ключевое слово COMMON для доступа к глобальным переменным. Использование COMMON в FORTRAN продолжилось в FORTRAN 77, [1] и повлияло на более поздние языки, такие как PL/SQL. Именованные группы COMMON для глобальных переменных ведут себя как структурированные пространства имен. [2] Переменные также по умолчанию являются глобальными в Forth , Lua , Perl и большинстве оболочек.
В языке C нет global
ключевого слова . Однако переменные, объявленные вне функции, имеют «область действия файла», то есть они видимы внутри файла. Переменные, объявленные в области файла, видны между их объявлением и концом единицы компиляции ( .c
файла) (если только они не затенены объектом с таким же именем в более близкой области видимости, например локальной переменной); и они неявно имеют внешнюю связь и, таким образом, видны не только файлу .c
или единице компиляции , содержащей их объявления, но также и любой другой единице компиляции, которая связана для формирования полной программы. Однако внешней связи недостаточно для использования такой переменной в других файлах: чтобы модуль компиляции мог правильно получить доступ к такой глобальной переменной, ему необходимо знать ее тип. Это достигается путем объявления переменной в каждом файле с использованием extern
ключевого слова. (Он будет объявлен в каждом файле, но может быть определен только в одном.) Такие extern
объявления часто помещаются в общий файл заголовка, поскольку общепринятой практикой является .c
включение всех файлов в проекте по крайней мере в один .h
файл: стандартный файл заголовка. errno.h
является примером того, как сделать errno
переменную доступной для всех модулей проекта. Если этот механизм глобального доступа считается проблематичным, его можно отключить с помощью static
ключевого слова , которое ограничивает переменную областью файла и приведет к тому, что попытки импортировать ее вызовут extern
ошибку компиляции (или связывания). [3]
Пример «глобальной» переменной в C :
#include <stdio.h> // Это переменная области файла (с внутренней связью), видимая // только в этом модуле компиляции. статический int общий = 3 ; // У этого есть внешняя связь (не ограничивающаяся этим модулем компиляции). внешний int over_shared ; // Также внутренняя связь. int over_shared_too = 2 ; static void ChangeShared () { // Ссылка на переменную области файла в функции. общий = 5 ; } static void LocalShadow () { // Локальная переменная, которая скроет одноименную глобальную переменную. int общий ; // Это повлияет только на локальную переменную и не окажет никакого влияния на // переменную области файла с тем же именем. общий = 1000 ; } static void ParamShadow ( int Shared ) { // Это повлияет только на параметр и не окажет никакого влияния на // переменную области видимости файла с тем же именем. общий = - общий ; } int main () { // Ссылка на переменную области файла. printf ( "%d \n " , общий ); ИзменениеОбщего (); printf ( "%d \n " , общий ); Локальная Тень (); printf ( "%d \n " , общий ); ПарамТень ( 1 ); printf ( "%d \n " , общий ); вернуть 0 ; }
Поскольку переменная является внешней, нет необходимости передавать ее в качестве параметра, чтобы использовать ее в функции помимо основной. Он принадлежит каждой функции в модуле.
Результатом будет:
3555
Некоторые языки, например Java, не имеют глобальных переменных. В Java все переменные, которые не являются локальными переменными, являются полями класса. Следовательно, все переменные находятся в области действия либо класса, либо метода. В Java статические поля (также известные как переменные класса ) существуют независимо от каких-либо экземпляров класса, и одна копия является общей для всех экземпляров; следовательно, общедоступные статические поля используются во многом для тех же целей, что и глобальные переменные в других языках, из-за их схожего поведения «совместного использования»:
общественный класс Global { public static int a ; }
В PHP есть global
ключевое слово и ряд необычных способов использования глобальных переменных. Переменные, объявленные вне функций, имеют область действия файла (которая для большинства целей является самой широкой областью действия). Однако они недоступны внутри функций, если они не импортированы с помощью global
ключевого слова (т. е. ключевое слово обращается к глобальным переменным, но не объявляет их).
Однако некоторые предопределенные переменные, известные как суперглобальные переменные , всегда доступны. Все они являются массивами. Общего назначения является суперглобальный $GLOBALS
, который содержит все переменные, определенные вне области действия функции. Изменения его элементов изменяют исходные переменные, а дополнения создают новые переменные. Суперглобальные переменные $_POST
широко $_GET
используются в веб-программировании.
global
ключевого слова. [4] [5]$
' . Существует ряд предопределенных глобальных переменных, например, текущий идентификатор процесса .$$