전역 변수

Global variable

컴퓨터 프로그래밍에서 전역 변수는 전역 범위를 가진 변수입니다. 따라서 음영 처리되지 않는 한 프로그램 전체에서 볼 수 있습니다.모든 글로벌 변수 집합을 글로벌 환경 또는 글로벌 상태라고 합니다.컴파일 언어에서 글로벌 변수는 일반적으로 정적 변수이며, 이 변수의 범위(수명)는 프로그램의 전체 런타임입니다.단, 인터프리터 언어(명령줄 인터프리터 포함)에서는 글로벌 변수가 선언될 때 일반적으로 동적으로 할당됩니다.이는 글로벌 변수가 사전에 알려져 있지 않기 때문입니다.

일부 언어에서는 모든 변수가 글로벌 또는 기본적으로 글로벌한 반면, 대부분의 현대 언어에서 변수는 제한된 범위(일반적으로 어휘적 범위)를 가지지만 글로벌 변수는 종종 프로그램의 최상위 수준에서 변수를 선언하여 사용할 수 있습니다.그러나 다른 언어에서는 글로벌 변수가 존재하지 않습니다.일반적으로 모듈 구조를 적용하는 모듈러형 프로그래밍 언어 또는 클래스 구조를 적용하는 클래스 기반 객체 지향 프로그래밍 언어입니다.

사용하다

글로벌 변수와의 상호작용 메커니즘은 글로벌 환경(글로벌 상태 참조) 메커니즘이라고 불립니다.글로벌 환경 패러다임은 모든 변수가 공유 메모리가 없는 로컬 환경 패러다임과 대조됩니다(따라서 모든 상호작용을 메시지 전달로 재전송할 수 있습니다.

글로벌 변수는 동시 스레드 및 신호 핸들러와 같이 발신자/착신자 관계를 공유하지 않는 코드 섹션 간에 정보를 전달하기 위해 광범위하게 사용됩니다.각 파일이 암묵적인 네임스페이스를 정의하는 언어(C 포함)는 글로벌 네임스페이스를 가진 언어에서 볼 수 있는 대부분의 문제를 제거합니다.단, 일부 문제는 적절한 캡슐화를 사용하지 않으면 지속될 수 있습니다.적절한 잠금(뮤텍스 사용 등)이 없으면 글로벌 변수를 사용하는 코드는 보호된 메모리의 읽기 전용 값을 제외하고는 스레드 안전하지 않습니다.

환경 변수

환경 변수는 일부 운영 체제에서 제공하는 기능입니다.OS 내(Unix경우 ksh, Linux경우 bash, COMMAND).DOS CMD의 COM.Windows의 EXE)는 변수의 일종입니다.예를 들어 Unix 및 관련 시스템에서는 일반 변수가 환경 변수가 됩니다.export키워드가 사용됩니다.셸 이외의 프로그램 코드는 다음과 같은 API 호출을 통해 액세스해야 합니다.getenv()그리고.setenv().

이들은 설정된 프로세스에 대해 로컬입니다.즉, 2개의 터미널 창(2개의 서로 다른 프로세스 실행 셸)을 열고 한 창에서 환경변수 값을 변경하면 다른 창에서는 해당 변경이 표시되지 않습니다.

하위 프로세스가 생성되면 상위 프로세스에서 모든 환경 변수와 해당 값을 상속합니다.보통 프로그램이 다른 프로그램을 호출할 때 먼저 포킹을 통해 하위 프로세스를 생성한 다음 필요에 따라 환경을 조정하고 마지막으로 호출할 프로그램으로 자신을 대체합니다.따라서 하위 프로세스는 환경 변수를 사용하여 동료와 통신할 수 없으므로 원격 문제에서의 작업을 피할 수 있습니다.

글로벌 전용 및 글로벌 디폴트

(초기 버전의) BASIC, COBOLFortran I(1956)와 같은 많은 비구조화 언어들은 글로벌 변수만 제공합니다.Fortran II(1958)는 로컬 변수를 포함한 서브루틴과 글로벌 변수에 액세스하기 위한 COMMON 키워드를 도입했습니다.FORTRAN [1]77에서 COMMON의 사용은 계속되었으며, PL/SQL과 같은 이후 언어에 영향을 미쳤다.글로벌용 COMMON 그룹은 구조화된 [2]네임스페이스와 비슷하게 동작한다.변수는 FORTH, Lua, Perl 및 대부분의 셸에서도 기본적으로 글로벌합니다.

언어별

C 및 C++

C 언어에는 다음 명령어가 없습니다.global 키워드를 지정합니다.그러나 함수 외부에 선언된 변수에는 파일 범위(파일 내에서 볼 수 있음)가 있습니다.파일 범위로 선언된 변수는 선언과 컴파일 유닛의 끝 사이에 표시됩니다(.cfile) (로컬 변수와 같은 더 가까운 범위에서 같은 이름의 객체에 의해 음영 처리되지 않는 한), 그리고 그것들은 암묵적으로 외부 링크를 가지고 있기 때문에, 그뿐만 아니라,.c선언을 포함하는 파일 또는 컴파일 유닛뿐만 아니라 완전한 프로그램을 형성하기 위해 연결된 다른 모든 컴파일 유닛에도 적용됩니다.그러나 외부 링크는 이러한 변수가 다른 파일에서 사용하기에 충분하지 않습니다. 컴파일 유닛이 이러한 글로벌 변수에 올바르게 액세스하려면 해당 유형을 알아야 합니다.이것은, 각 파일의 변수를 선언하는 것으로 실현됩니다.extern키워드를 지정합니다.(이것은 각 파일에 선언되지만, 1개의 파일에만 정의할 수 있습니다).그런extern선언은 공유 헤더 파일에 배치되는 경우가 많습니다.프로젝트 내의 모든 .c 파일은 적어도1개를 포함하는 것이 일반적이기 때문입니다..h파일: 표준 헤더 파일errno.h예를 들면,errno프로젝트의 모든 모듈이 액세스할 수 있는 변수입니다.이 글로벌액세스 메커니즘에 문제가 있다고 판단되는 경우 변수를 파일 범위로 제한하는 키워드를 사용하여 디세블로 할 수 있습니다.또, 이 메커니즘에 의해서, 파일의 Import가 시행됩니다.extern컴파일([3]또는 링크) 오류를 발생시킵니다.

C의 "글로벌" 변수의 예를 다음에 나타냅니다.

#실패하다 <stdio.h>  // 이것은 파일 범위 변수(내부 링크 포함)로, 에만 표시됩니다. // 이 컴파일 유닛. 정적인 인트 공유했습니다. = 3;  // 이것은 외부 링크(이 컴파일 유닛에 한정되지 않음)가 있습니다. 외부 인트 오버 공유;  // 내부 링크도 있습니다. 인트 over_shared_to = 2;  정적인 무효 변경 공유() {   // 함수의 파일 범위 변수에 대한 참조입니다.   공유했습니다. = 5; }  정적인 무효 로컬 섀도() {   // 같은 이름의 전역이 숨겨지는 로컬 변수입니다.   인트 공유했습니다.;    // 이것은 로컬 변수에만 영향을 미치며, 이 변수에는 영향을 주지 않습니다.   // 같은 이름의 file-module 변수.   공유했습니다. = 1000; }  정적인 무효 ParamShadow(Param Shadow)(인트 공유했습니다.) {   // 이것은 파라미터에만 영향을 주고 파일에는 영향을 주지 않습니다.   // 같은 이름의 스코프 변수.   공유했습니다. = -공유했습니다.; }  인트 주된() {   // 파일 범위 변수에 대한 참조입니다.    인쇄물(%d\n", 공유했습니다.);    변경 공유();    인쇄물(%d\n", 공유했습니다.);    로컬 섀도();    인쇄물(%d\n", 공유했습니다.);    ParamShadow(Param Shadow)(1);    인쇄물(%d\n", 공유했습니다.);    돌아가다 0; } 

변수는 외부 변수이므로 main 이외의 함수에서 사용하기 위해 파라미터로 전달할 필요가 없다.모듈의 모든 기능에 속합니다.

출력은 다음과 같습니다.

3 5 5 5

자바

Java와 같은 일부 언어에는 글로벌 변수가 없습니다.Java에서는 로컬 변수가 아닌 모든 변수는 클래스의 필드입니다.따라서 모든 변수는 클래스 또는 메서드의 범위에 포함됩니다.Java에서는 정적 필드(클래스 변수라고도 함)가 클래스의 모든 인스턴스와 독립적으로 존재하며 하나의 복사본이 모든 인스턴스에서 공유됩니다.따라서 공용 정적 필드는 유사한 "공유" 동작 때문에 다른 언어의 글로벌 변수와 동일한 목적으로 사용됩니다.

일반의 학급 세계적인 {     일반의 정적인 인트 a; } 

PHP

PHP에는global키워드 및 글로벌 변수를 사용하는 여러 가지 특이한 방법.외부 함수로 선언된 변수에는 파일 범위(대부분의 경우 가장 넓은 범위)가 있습니다.단, 이 명령어는 다음 명령어와 함께 Import되지 않는 한,global키워드(, 키워드는 글로벌 변수에 액세스하지만 글로벌 변수를 선언하지 않습니다).

그러나 슈퍼글로벌로 알려진 일부 사전 정의된 변수는 항상 액세스할 수 있습니다.모두 어레이입니다.일반적인 목적은$GLOBALSsuperglobal: 함수 범위에서 정의된 모든 변수가 포함됩니다.요소를 변경하면 원래 변수가 변경되고 추가에 따라 새 변수가 생성됩니다.슈퍼글로벌$_POST그리고.$_GET웹 프로그래밍에서 널리 사용됩니다.

기타 언어

  • Python MATLAB에서는 글로벌 변수를 선언할 수 있습니다.global키워드를 [4][5]지정합니다.
  • Ruby의 글로벌 변수는 ''로 구분됩니다.$표식.예를 들어 사전 정의된 글로벌이 다수 존재합니다.$현재 프로세스 ID 입니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Fortran 77 Tutorial".
  2. ^ "First Steps: Stack & Heap Objects".
  3. ^ 간단히 말하면 C, P.Prinz & T Crowford, 2006년, O'Reilly, Ch 11
  4. ^ "What are the rules for local and global variables in Python?". docs.python.org. Python Software Foundation. Retrieved 4 June 2020.
  5. ^ "Declare variables as global". in.mathworks.com. The MathWorks, Inc. Retrieved 7 February 2015.