Глобальная переменная - Global variable

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

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

Использовать

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

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

Переменные среды

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

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

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

Только глобальный и глобальный по умолчанию

Ряд не-структурированный языки, такие как (ранние версии) БАЗОВЫЙ, КОБОЛ и Фортран Я (1956) привожу только глобальные переменные. В Fortran II (1958) были введены подпрограммы с локальными переменными и ключевое слово COMMON для доступа к глобальным переменным. Использование COMMON в FORTRAN продолжилось в FORTRAN 77,[1] и повлиял на более поздние языки, такие как PL / SQL. Именованные ОБЩИЕ группы для глобальных объектов ведут себя как структурированные пространства имен.[2] По умолчанию переменные также являются глобальными. Четвертый, Lua, Perl, и большинство оболочек.

По языку

C и C ++

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

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

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

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

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

3555

Ява

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

общественный учебный класс Глобальный {    общественный статический int а;}

PHP

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

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

Другие языки

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

Смотрите также

Рекомендации

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