변수 형태,extern

C & C++ 관련 : 2007. 12. 6. 11:51
반응형

C 프로그램 지역변수.전역변수.정적변수 외부변수.. 가르처주세요

지역변수


함수 내에서 선언하여 함수 내에서만 사용합니다. 함수를 벗어나면 메모리에서 삭제되어 사용하실 수 없습니다. 즉 함수 A와 B가 있고 함수 A에서 선언한 변수는 B에서 불러들일수 없다는 뜻입니다.


전역변수


함수 밖에서 선언하며 그 파일 안의 모든 함수에서 사용할 수 있습니다.


정적변수


함수 안에서 선언한 정적변수는 지역변수가 아닌 전역변수로 사용됩니다. 즉 메모리에서 삭제되지 않고 남아있기 때문에 A함수에서 static으로 선언한 정적변수는 B함수에서 사용하실 수 있습니다.


외부변수


외부변수는 다른 파일에서 그 변수를 불러들일 수 있습니다. 즉 file1.c에서 extern으로 선언한 변수는 file2.c에서 file1.c를 통해 접근할 수 있습니다.





1. 통용범위

a. 지역변수  -  각 실행문 블럭의 앞부분에 한해서 변수를 선언할 수 있습니다.

     (C++는 블럭의 중간에서도 선언할 수 있죠.) 그리고, 이 블럭 종료시까지만 그 변수가

     유효합니다. (함수블럭 이나 제어문에 딸린 블럭 이외에도 그냥 블럭에도 통용됩니다.)

     이렇게 각 블럭의 앞 부분에 선언되는 변수가 지역변수입니다. 그 변수명은 그 블럭

     내에서만 유효하기 때문이죠.


b. 전역변수 -  어떤 블럭 내부에도 속하지 않고 그냥 소스파일 바닥에 휑하니 던져져

     있는 변수를 전역변수라고 합니다. 특정 블럭에 국한되지 않고 전역적으로

     유효하다는 것이죠.


c. 멤버변수 - 클래스나 구조체의 멤버로 선언된 변수입니다.

     C의 구조체는 멤버함수를 가질 수 없기 때문에 멤버변수를 새로운 통용범위로 보지

     않습니다. 하지만, C++에서는 구조체나 클래스가 멤버함수를 가질 수 있고

      멤버함수는 해당 구조체 변수나 객체의 멤버변수를 지역변수처럼 읽고 쓸 수 있기

      때문에 멤버변수를 새로운 변수 통용범위로 취급합니다.


2. 기억장소

a. 메모리 지정자 -  auto, register, static, extern 변수 선언문 앞에 붙습니다.

b. 자동 변수 - 메모리 지정자 auto 를 이용해 선언한 지역변수

                          또는 특별한 메모리 지정자 없이 선언한 지역변수입니다.

                          자동 변수는 블럭의 시작 종료시 자동으로 생성/소멸되기 때문에

                          블럭 내에 선언되지 않는 전역변수는 자동변수가 될 수 없습니다.


b. 레지스터 변수 - 루프의 제어변수로 쓰이는 i같은 변수에 cpu의 레지스터를

                          전용 할당해주어서 연산속도를 빠르게 해줍니다. 지역변수만

                          register 지정 가능하며, 컴파일러에게 부탁하는 정도의 지정자입니다.


c. 지역정적변수 - static 지정자를 사용하여 선언된 지역변수는 스택에 생성되지

                          않고 정적메모리 영역에 선언되어 프로그램 종료시까지 유지됩니다.

                          초기화는 해당 함수가 처음으로 실행됐을 때 한 번만 수행됩니다.

                          static 변수는 단 하나의 복사본만 가지므로  재귀함수 내에서는

                          사용하지 않는 것이 좋습니다.


d. 전역변수 - 전역변수는 무조건 정적메모리 영역에 생성됩니다.


e. 외부변수 - 외부 스코프에 선언된 변수를 현재 스코프에서 사용하게 해줍니다.

                         주로 다른 파일에서 선언된 전역변수를 참조하는 목적으로 사용합니다.

                         그렇지만 정적전역변수는 참조할 수 없습니다.


f. 정적멤버변수(C++) - static 지정자를 사용하여 선언된 멤버변수는 단 하나의

                         인스턴스(복사본)만을  갖습니다. 다른 멤버변수들이 그 객체가 생성된

                         메모리에 생성되는 것에 비해서 정적멤버변수는 정적메모리영역에

                         딱 한번만 생성되고 프로그램 종료시까지 유지됩니다.


3. 링키지

a. 분할 컴파일과 링크

        -> 여러 개의 소스파일로 이루어진 프로그램은 각 소스별로 따로 컴파일해서

            나중에 링커라는 프로그램으로 합치게 됩니다. 이 때 각각의 파일이 가지고

            있는 함수호출과 함수주소를 연결하고, 전역변수와 외부변수도 연결하게 됩니다.


b. 외부 링키지

           컴파일시 컴파일러는 기본적으로 C의 모든 함수와 전역변수의 주소를

           오브젝트파일 외부로 노출시킵니다. 이 것을 외부링키지라고 합니다.

          그리고 함수 원형과 외부변수는 이 외부링키지를 받을 수 있도록 컴파일 됩니다.


c. 외부변수선언 - 다른 파일에 있는 전역변수의 외부링키지와 연결될 수 있는 창구를

                           만듭니다.

 

d. 함수 원형 - static이 지정되지 않았고 파일 내에 해당 함수가 없으면 다른 파일에

                           있는 함수의 외부링키지와 연결될 수 있는 창구를 만듭니다.


c. 정적전역변수 - static 지정자를 사용하여 선언된 전역변수는 통용범위가

                          파일 내로 제한되게 됩니다. 즉 외부링키지를 만들지 않습니다.


d. 정적함수 - static 지정자를 사용하여 선언된 함수도 외부링키지를 만들지 않으므로

                         통용범위가 파일 내로 제한됩니다.


※ 정적함수나 정적전역변수를 다른 파일에서 액세스하려고 하면 링크에러가

     발생됩니다.


반응형

'C & C++ 관련' 카테고리의 다른 글

inline 함수  (0) 2007.12.06
extern  (0) 2007.12.06
#difine과 typedef 와 const 의 정의와 예제줌  (0) 2007.10.22
Posted by Real_G