C언어에서 extern과 static의 사용법을 알아보자.
1. 전역 변수 앞에 쓰이는 extern 과 static
1) extern 전역 변수
<main.c 소스>
전역 변수를 선언만하고 나중에 사용할 때 값을 지정할 수 있다.
int global_var;
void main()
{
    global_var = 1;
    printf("%d \n", global_var);
}
아래처럼 사용하면 변수를 선언하면서 초기화를 동시에할 수 있다.
int global_var = 1;
void main()
{
     printf("%d \n", global_var);;
}
이제 앞의 <main.c>에서 선언한 전역 변수를 다른 파일의 코드에서 사용하려면 아래와 같이 하면된다.
<sub.c 소스>
extern int global_val;
int sub()
{
     global_val = 1
     printf("[sub]%d \n", global_var);;
}
위의 <sub.c 소스>에서 extern int global_val;를 아래 코드 처럼 int global_val;로 선언해도 잘 동작한다.
int global_val;
int sub()
{
     global_val = 1
     printf("[sub]%d \n", global_var);;
}
그 이유는 전역변수는 기본적으로 extern 이기 때문이다.  하지만 <main.c>나 <sub.c> 둘 중 어딘가에서는 반드시 int global_val; 로 정의되어야 한다. 즉, 모든 파일에서  extern int global_val; 처럼 extern 키워드를 쓰면 빌드 에러가 날 수 있다.
2) static 전역 변수
static 키워드를 전역 변수에 쓰면 그 전역 변수는 해당 파일안에서만 전역 변수로 동작한다. 즉 extern에 의하여 다른 파일에서는 이용할 수가 없다. 일반적으로 extern을 이용하여 다른 파일에서도 전역 변수에 접근하게 하기 보다는 static 키워드를 이용하여 한 파일에서만 전역 변수로 사용하고, 다른 파일에서는 별도의 함수를 이용하여 값을 변경하거나, 얻는 방법을 이용하는 것이 바람직하다.<main.c 소스>
void main()
{
    int local_var = 1;
    printf("[before] Get = %d\n",getVariable());
    printf("[before] Add Result = %d\n",sum(local_var));
    setVariable(100);
    printf("[after] Get = %d\n",getVariable());
    printf("[after] Add Result = %d\n",sum(local_var));
}
<add.c 소스>
static int global_static = 1;
int sum(int a)
{
    return (a + global_static);
}
void setVariable(int a)
{
    global_static = a;
}
int getVariable(void)
{
    return global_static;
}
'프로그래밍 > C/C++/C#' 카테고리의 다른 글
| C언어에서 구조체 사용 시 주의 사항 (0) | 2014.05.03 | 
|---|---|
| Makefile에서 -D로 정의하기 (0) | 2014.05.03 | 
| DLL과 LIB 차이점 설명 (0) | 2012.11.10 | 
| C/C++ 코딩시 main에 인자 넘기고 처리하는 방법 (0) | 2010.06.05 | 
| VC++을 이용한 Serial 통신 프로그램 만들기 [고급] (0) | 2009.12.25 |