외부 변수
External variableC 프로그래밍 언어에서 외부 변수는 기능 블록 외부에서 정의된 변수다.반면 국소(자동) 변수는 함수 블록 내부에 정의된 변수다.null
자동변수에 대한 대안으로 모든 기능에 외부적인 변수, 즉 어떤 함수에 의해서도 이름으로 접근할 수 있는 변수를 정의할 수 있다.(이 메커니즘은 오히려 가장 바깥쪽 블록에서 선언된 Fortran CONMARY 또는 Pascal 변수와 같다.)외부 변수는 세계적으로 접근할 수 있기 때문에 인수 목록 대신 기능 간 데이터 통신에 사용할 수 있다.나아가 외부 변수는 함수를 부르고 내보내는 것처럼 나타나고 사라지는 것이 아니라 영구적으로 존재하기 때문에, 설정한 함수가 돌아온 후에도 그 가치를 유지한다.
정의, 선언 및extern키워드
외부 변수와 의 관계에 대한 이해extern키워드, 변수를 정의하는 것과 선언하는 것의 차이를 알아야 한다.변수가 정의되면 컴파일러는 해당 변수에 대해 메모리를 할당하고 그 내용을 일부 값으로 초기화할 수 있다.변수가 선언되면 컴파일러는 변수를 다른 곳에서 정의해야 한다.선언문은 컴파일러에게 그 이름과 유형에 따른 변수가 존재한다고 알려 주지만 컴파일러는 다른 곳에 할당되기 때문에 그에 대한 메모리를 할당할 필요가 없다.그extern키워드는 "정의하지 않은 상태"를 의미한다.변수를 명시적으로 선언하거나, 정의 없이 선언을 강요하는 방식이라는 얘기다.변수를 명시적으로 정의하는 것, 즉 정의를 강요하는 것도 가능하다.변수에 초기화 값을 할당하여 수행된다.만약 둘 다 그렇지 않다면extern키워드나 초기화 값이 존재하며, 문장은 선언 또는 정의일 수 있다.프로그램의 모듈을 분석하고 결정하는 것은 컴파일러의 몫이다.null
변수는 프로그램의 모듈 중 하나에 정확히 한 번 정의해야 한다.정의가 없거나 둘 이상일 경우, 연결 단계에서 오류가 발생한다.선언이 서로 일치하고 정의(헤더 파일이 크게 유용한 것)와 일치하는 한 변수는 여러 번 선언될 수 있다.그것은 그것이 정의된 모듈을 포함한 많은 모듈에서 그리고 심지어 같은 모듈에서 여러 번 선언될 수 있다.그러나 보통 모듈에서 한 번 이상 선언하는 것은 무의미하다.null
외부 변수는 함수 내부에서 선언될 수도 있다.이 경우에는extern키워드를 사용해야 하며 그렇지 않으면 컴파일러는 범위, 수명 및 초기 값이 다른 로컬(자동) 변수의 정의로 간주한다.이 선언은 함수의 모듈 전체 대신 함수의 내부에서만 볼 수 있다.null
그extern기능 프로토타입에 적용된 키워드는 전혀 아무 것도 하지 않는다.extern함수 정의에 적용된 키워드는 물론 비감각적이다.기능 프로토타입은 항상 선언이며 정의가 아니다.또한, 표준 C에서 함수는 항상 외부에 있지만, 일부 컴파일러 확장자는 함수의 내부에서 함수를 정의할 수 있다.null
외부 변수는 정확히 한 번 기능 외부에서 정의되어야 한다. 이것은 그것을 위한 저장 공간을 따로 둔다.변수에 접근하려는 각 함수에 변수를 선언해야 한다. 변수의 유형을 명시한다.그 선언은 명시적일 수 있다.
extern또는 문맥에서 암시하는 것일 수도 있다. ...이 절에서 외부 변수를 참조할 때 정의와 선언이라는 단어를 주의 깊게 사용하고 있다는 점에 유의하십시오.정의란 변수를 생성하거나 저장소를 할당하는 장소를 말하며, 선언은 변수의 성질은 명시되 저장소는 할당되지 않는 장소를 가리킨다.null
범위, 수명 및static키워드
외부 변수는 프로그램의 모든 모듈의 모든 기능에 의해 접근할 수 있다.글로벌 변수다.함수가 변수를 사용할 수 있으려면 소스 코드에서 함수 정의 앞에 선언 또는 외부 변수의 정의가 있어야 한다.아니면 키워드와 함께 변수의 선언이 있어야 한다.extern, 함수에.null
키워드 ()static그리고extern외부 변수의 정의에 적용되는 상호 배타적(상호 배타적)은 이 변수를 약간 변경한다. 즉, 변수는 정의된 동일한 모듈의 기능에 의해서만 액세스할 수 있다.그러나 동일한 모듈의 함수가 변수의 참조(점자)를 다른 모듈의 다른 함수에 전달하는 것은 가능하다.이 경우, 기능이 다른 모듈에 있더라도 변수의 내용을 읽고 수정할 수 있다. 다만 이름만으로는 그것을 참조할 수 없다.null
또한 이 제품을 사용하는 것도 가능하다.static로컬 변수의 정의에 대한 키워드.다음이 없는static키워드, 기능이 종료될 때("자동 변수"라는 이름 붙임) 함수를 호출하고 해제할 때 변수가 자동으로 할당된다.함수 호출 간에는 값이 유지되지 않는다.With thestatic키워드, 변수는 프로그램 시작 시 할당되고 프로그램 종료 시 공개된다.함수 호출 간에는 값이 손실되지 않는다.변수는 그것을 정의한 함수 안에서 이름만으로 접근할 수 있기 때문에 여전히 국부적이다.그러나 그것에 대한 참조(점자)는 다른 함수에 전달될 수 있어 변수의 내용을 읽고 수정할 수 있다(이름으로 참조하지 않고 동의함).null
외부 변수는 프로그램이 시작될 때 할당되고 초기화되며, 메모리는 프로그램이 종료될 때만 해제된다.그들의 수명은 프로그램의 수명과 같다.null
초기화가 명시적으로 이뤄지지 않으면 외부(정적 또는 그렇지 않음) 및 국소 정적 변수가 0으로 초기화된다.로컬 자동 변수는 초기화되지 않음, 즉 "쓰레기" 값을 포함함.null
그static함수 정의에 적용된 키워드는 함수의 정의가 위치한 번역 단위에서만 볼 수 있도록 함수의 연결을 변경한다.이렇게 하면 기능이 모듈 외부에서 이름으로 호출되는 것을 방지할 수 있다(모듈에서 기능 포인터를 전달하고 기능을 호출하는 데 사용할 수 있다.를 사용하여 함수 선언static키워드는 또한 이름 충돌을 피하면서 이름을 짧게 유지하는 좋은 방법이다.null
예(C 프로그래밍 언어)
파일 1:
// 명시적 정의, 이것은 실제로 할당된다. // 설명뿐만 아니라 인트로 전역_변수; // 기능 프로토타입(선언), 가정 // 일반적으로 포함 파일에서 다른 곳에서 정의된다.null 공허하게 하다 일부 기능(공허하게 하다); 인트로 본래의(공허하게 하다) { 전역_변수 = 1; 일부 기능(); 돌아오다 0; } 파일 2:
// 암묵적 선언, 이것은 단지 그리고 // 일반적으로 다음을 포함하여 다른 곳에 할당되는 것으로 가정 바깥의 인트로 전역_변수; // 함수 헤더(정의) 공허하게 하다 일부 기능(공허하게 하다) { ++전역_변수; } 이 예에서 Global_Variable 변수는 파일 1에 정의되어 있다.파일 2에서 동일한 변수를 활용하려면 이를 선언해야 한다.파일 수와 관계없이 전역 변수는 한 번만 정의되지만, 이 정의가 포함된 파일 이외의 파일에 선언되어야 한다.null
프로그램이 여러 원본 파일에 있고 변수가 file1에 정의되어 file2와 file3에 사용되는 경우 변수의 발생을 연결하기 위해 file2와 file3에 외부 선언이 필요하다.통상적인 관행은 역사적으로 헤더라고 불리는 변수와 함수의 외부 선언을 각각의 소스 파일의 전면에 #include하여 포함하는 별도의 파일로 수집하는 것이다.접미사 .h는 헤더 이름의 관습이다.null
일반적인 방법론은 할당과 실제 정의가 .c 파일로 들어가는 것이지만, 단순한 선언과 프로토타입만이 할당되지 않고 형식과 매개변수를 기술하여 컴파일러가 올바르게 작동할 수 있으며, 그 정보는 다른 사람들이 어떠한 충돌도 일으키지 않고 안전하게 포함할 수 있는 .h 헤더 파일에 속한다.null
참고 항목
참조
외부 링크
- Microsoft C 언어 참조:외부 수준 선언에 대한 스토리지 클래스 지정자
- "The C Standard (C99 with Technical corrigenda TC1, TC2, and TC3 included)" (PDF).(3.61 MiB).특히 섹션 6.2.2(식별자 링크), 6.2.4(물체의 저장 기간), 6.7.1(저장 등급 지정자) 및 6.9(외부 정의)를 참조한다.