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

C 언어에서 extern과 staic 변수의 이해

by choies1 2013. 6. 16.

 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;
}