Глобальная переменная
Эта статья нуждается в дополнительных цитатах для проверки . ( июль 2009 г. ) |
В компьютерном программировании глобальная переменная — это переменная с глобальной областью действия , что означает, что она видна (следовательно, доступна) во всей программе, если только она не затенена . Набор всех глобальных переменных известен как глобальная среда или глобальное состояние. В компилируемых языках глобальные переменные обычно являются статическими переменными , размер которых (время жизни) равен всему времени выполнения программы, хотя в интерпретируемых языках (включая интерпретаторы командной строки ) глобальные переменные обычно динамически выделяются при объявлении, поскольку они неизвестны. раньше времени.
В некоторых языках все переменные являются глобальными или глобальными по умолчанию, в то время как в большинстве современных языков переменные имеют ограниченную область действия, обычно лексическую , хотя глобальные переменные часто доступны путем объявления переменной на верхнем уровне программы. Однако в других языках глобальные переменные не существуют; Обычно это модульные языки программирования, обеспечивающие модульную структуру, или на основе классов, объектно-ориентированные языки программирования обеспечивающие структуру классов.
Использовать
[ редактировать ]Механизмы взаимодействия с глобальными переменными называются механизмами глобальной среды (см. также глобальное состояние ). Парадигма глобальной среды контрастирует с парадигмой локальной среды , где все переменные являются локальными и не имеют общей памяти (и, следовательно, все взаимодействия могут быть сведены к передаче сообщений ).
Глобальные переменные широко используются для передачи информации между разделами кода, которые не имеют общего отношения вызывающий/вызываемый объект, например параллельные потоки и обработчики сигналов. Языки (включая 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 и большинстве оболочек.
По языку
[ редактировать ]С и С++
[ редактировать ]В языке Си нет global
ключевое слово . Однако переменные, объявленные вне функции, имеют «область действия файла», то есть они видимы внутри файла. Переменные, объявленные в области файлов, видны между их объявлением и концом единицы компиляции ( .c
файл) (если только он не затенен объектом с таким же именем в более близкой области видимости, например локальной переменной); и они неявно имеют внешнюю связь и, таким образом, видны не только .c
файл или модуль компиляции , содержащий их объявления, но также и любой другой модуль компиляции, который связан для формирования полной программы. Однако внешней связи недостаточно для использования такой переменной в других файлах: чтобы модуль компиляции мог правильно получить доступ к такой глобальной переменной, ему необходимо знать ее тип. Это достигается путем объявления переменной в каждом файле с помощью extern
ключевое слово. (Он будет объявлен в каждом файле, но может быть определен только в одном.) extern
объявления часто помещаются в общий заголовочный файл, поскольку это обычная практика для всех .c
файлы в проекте, чтобы включить хотя бы один .h
файл: стандартный файл заголовка errno.h
является примером, делающим errno
переменная, доступная всем модулям проекта. Если этот механизм глобального доступа считается проблематичным, его можно отключить с помощью static
ключевое слово , которое ограничивает переменную областью файла и вызывает попытки импортировать ее с помощью extern
чтобы вызвать ошибку компиляции (или связывания). [3]
Пример «глобальной» переменной в C :
#include <stdio.h>
// This is the file-scope variable (with internal linkage), visible only in
// this compilation unit.
static int shared = 3;
// This one has external linkage (not limited to this compilation unit).
extern int over_shared;
// Also internal linkage.
int over_shared_too = 2;
static void ChangeShared() {
// Reference to the file-scope variable in a function.
shared = 5;
}
static void LocalShadow() {
// Local variable that will hide the global of the same name.
int shared;
// This will affect only the local variable and will have no effect on the
// file-scope variable of the same name.
shared = 1000;
}
static void ParamShadow(int shared) {
// This will affect only the parameter and will have no effect on the file-
// scope variable of the same name.
shared = -shared;
}
int main() {
// Reference to the file-scope variable.
printf("%d\n", shared);
ChangeShared();
printf("%d\n", shared);
LocalShadow();
printf("%d\n", shared);
ParamShadow(1);
printf("%d\n", shared);
return 0;
}
Поскольку переменная является внешней, нет необходимости передавать ее в качестве параметра, чтобы использовать ее в функции помимо основной. Он принадлежит каждой функции в модуле.
Результатом будет:
3 5 5 5
Ява
[ редактировать ]Некоторые языки, например Java, не имеют глобальных переменных. В Java все переменные, которые не являются локальными переменными, являются полями класса. Следовательно, все переменные находятся в области действия либо класса, либо метода. В Java статические поля (также известные как переменные класса ) существуют независимо от каких-либо экземпляров класса, и одна копия является общей для всех экземпляров; следовательно, общедоступные статические поля используются во многом для тех же целей, что и глобальные переменные в других языках, из-за их схожего поведения «совместного использования»:
public class Global {
public static int a;
}
PHP
[ редактировать ]В PHP есть global
ключевое слово и ряд необычных способов использования глобальных переменных.
Переменные, объявленные вне функций, имеют файловую область действия (которая для большинства целей является самой широкой областью действия). Однако они недоступны внутри функций, если они не импортированы с помощью global
ключевое слово (т. е. ключевое слово обращается к глобальным переменным, но не объявляет их).
Однако некоторые предопределенные переменные, известные как суперглобальные переменные , всегда доступны.
Все они являются массивами. Общего назначения является $GLOBALS
суперглобальный, который содержит все переменные
определено вне области действия функции. Изменения его элементов изменяют исходные переменные, а дополнения создают новые переменные.
Суперглобальные переменные $_POST
и $_GET
широко используются в веб-программировании.
Другие языки
[ редактировать ]- В Python и MATLAB глобальную переменную можно объявить где угодно с помощью
global
ключевое слово. [4] [5] - Глобальные переменные Ruby отличаются символом '
$
' Сигил . Существует ряд предопределенных глобальных переменных, например$$
текущий идентификатор процесса .
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Урок по Фортрану 77» .
- ^ «Первые шаги: стек и куча объектов» .
- ^ C в двух словах, П.Принц и Т. Кроуфорд, 2006, О'Рейли, глава 11
- ^ «Каковы правила для локальных и глобальных переменных в Python?» . docs.python.org . Фонд программного обеспечения Python . Проверено 4 июня 2020 г.
- ^ «Объявить переменные как глобальные» . in.mathworks.com . Компания MathWorks, Inc. Проверено 7 февраля 2015 г.