본문 바로가기
프로그래밍/C·C++

전역변수&extern

by ITPro 2010. 8. 11.

- 프로그래머의 [적] 전역변수 -

 

안녕하세요.. extern에 대해 고민이 많으시군요..

한때, 저도 고민 많이 햇답니다.. extern << 이넘의 실체는?

전 이렇게 분류 하고 싶네요..

1. static 변수... 즉

void main 위에 위치하는 넘까지 포함해서..

  -- 전.역.변.수 -- 라고 부르고 싶네요..

2. 지역변수

{   } 안에 위치한넘... ( ) 포함해서.

 -- 지.역.변.수 라고 부르고 싶네요.

3. 광역변수

모든 프로젝트에 위치한넘.

 

 

전역변수는 에서는 선언된 이후라면 어디든 사용이 가능하죠..

하지만.. .h니 .c 니 이렇게 여러 프로젝트 단위로 나뉘어진 변수라면..

상.당.히 골치 아픕니다...

 

먼저 컴파일러가 되어서 생각 해보죠..

------- 1.c

int a;   // a가 선언 되어있네?

void main()

{

  a = 10;  // 그래 a값이10 이구나.. 좋아. 넣어주지

}

  // 컴파일 완료.. 아자 이상없구나~!!

-------- 2.c

// 새로 컴파일을 시작하네?

int sam()

{

   a = 10;  // 아자.. 이건 어디서 굴러먹다온 뼉다그야.. ㅡㅡ 젝힐.....

}

// 몰라 배째 error

 

그럼 광역변수는 어케 되는걸까 잠시 보죠..

위의 예를 가지고 하죠

 

프로그래머 : 난 a를 광역으로 쓰고 싶다그.....

PC : 그럼 광역으로 쓴다는 걸 알려줘 어느넘인지 모르겠어..

프로그래머 : 알따 헤더파일을 만드러주지 ㅡㅡ

 

------------ 1.h
extern int a;  // a너는 누구라도 쓸수 있는거야~~ 앙?

 

------- 1.c

#include "1.h"

int a;   // a가 선언 되어있네? 메모리에 공간을 잡자..

void main()

{

  a = 10;  // 그래 a값이10 이구나.. 좋아. 넣어주지

}

  // 컴파일 완료.. 아자 이상없구나~!!

 

 

-------- 2.c

#include "1.h"

// 새로 컴파일을 시작하네?

int sam()

{

   a = 20;  // 어라?  a가.. 전체적으로 사용하네.. (메모리 공간이 잡혀있나?) 오.. 잡혀있다.

}

// 좋아 굳굳굳...

 

------------ 즉 extern 선언은 컴파일러가 알아 듣기 위한 최소한의 요구 사항입니다.

아니면, 해당 변수를 찾을수가 없어서. 난리 치는거죠.. ㅠㅠ

이보다.. 간결한 방법은.. ^^;;;;;;; 쓰지 않고 지역 변수를 사용 하는 방법 입니다만...

 

모바일 프로그램 같은.. 속도를 요하는 프로그래밍에서는 변수를 지역으로 잡아서 새로이 생성 하는데 리스크가 너무 크다고 생각합니다.

int sam()  // 100번만 호출되도

{

   int a;  // 100번 생성해야하니 원~!!!

}

그래서 어쩔수 없이 전역 혹은 광역변수를 사용 하지요..

 

또한,, 모바일 OS 포팅 같이 꽤 방대한 분량의 코드에서는 전역변수 저넘이 어느 타이밍에서 어떤 값으로 변환되는지 알기가 쉽지 않아서.. 분담코드 작성에는 매.우. 비효율적입니다...

반응형

'프로그래밍 > C·C++' 카테고리의 다른 글

리눅스 로케일 세팅  (0) 2010.08.11
리눅스 curses.h 설명  (0) 2010.08.11
리눅스 curses.h 사용 예  (0) 2010.08.11
char ch = getchar();의 문제의 원인  (0) 2010.08.11
getc(), getch(), getchar()  (1) 2010.08.11

바로가기