Lasiyan
Code

지역변수, static, extern 정리

#C#C++#static#extern#변수

지역 변수 (Local Variable)

– 선언한 지역을 벗어나면 기억 공간에서 자동 소멸
– 지역은 { } 로 구분

#include <stdio.h>
int main()
{
    int a = 30;
    {
        int a = 60;
        printf(“1. a: %d\n”, a);
    }
    printf(“2. a: %d\n”, a);
    return 0;
}
1. a: 60
2. a: 30

정적 변수 (Static Variable)

– 정적 변수 사용하면 영역을 벗어나도 메모리 공간에서 소멸하지 않음
– 값 또한 그대로 유지
– 일종의 한번 선언하고 나면 계속 유지되는 변수
– 초기화 하지 않으면 자동으로 0으로 초기화

#include <stdio.h>
void count()
{
    static int c;
    c = c + 1;
    printf(“c: %d\n”, c);
}
void main()
{
    count();
    count();
    count();
}
c: 1
c: 2
c: 3

함수를 하나의 영역으로 생각한다면 static을 사용하였기 때문에

최초 함수가 실행된 이후 ( c: 1 )

c의 값이 초기화( c = 0 )이 되지 않고 1씩 증가하는 것을 볼 수 있다.

extern(extern variable)

– 모듈 별 분할 컴파일에서 사용
– 소스 밖에서도 사용 가능한 변수
– 쉽게말해 소스1.c에서 extern으로 선언한 변수는 동일 솔루션(프로젝트)의 소스2.c에서도 사용 가능

#include <stdio.h>
int externVariable;
extern void function();
void main()
{
    printf(“exVari: %d\n”, externVariable);
    function();
    printf(“exVari: %d\n”, externVariable);
}
exVari: 0
exVari: 100

소스1.c에서 externVariable을 선언하고 function에서 이 값은 100으로 저장.

이 후 소스2.c에서 해당 변수를 출력해보면 자동으로 0 초기화.

이는 static과 마찬가지로 선언 시 초기화 하지 않으면 자동 0으로 초기화된다.

또한 function() 함수 실행으로 변수 값이 100이 저장 되며

printf로 확인해보면 100 출력

컴파일 시 소스1.c와 소스2.c는 각각 소스1.o(object)와 소스2.o로 컴파일되고

이 두개의 object 파일을 링크하여 하나의 실행 파일(.exe)로 생성