분할 컴파일을 통한 static,  extern 확인

다음의 예제를 통해 static, extern 의 사용을 확인해 보자

파일은

main.c main.h test.c test.h로 구성된다.

 

main.c


#include "main.h"
#include <errno.h>
#include "test.h"


static int iA = 3;
extern int iB;

int main()
{
    printf("main :: start!!------\n");
    test(10);

    printf("errno:%d\n", errno);
   
    printf( "main :: iA : %d\n", iA);
    printf( "main :: iB : %d\n", iB);
    printf("main :: end!!------\n");

    return 0;
}

main.h

#ifndef __MAIN_H__
#define __MAIN_H__

#include <stdio.h>
#include <stdlib.h>

#endif

test.c

#include <stdio.h>
#include "test.h"

int iA;
int iB = 3;

void test(int iNum)
{
    printf("main :: start!!------\n");
    
    printf("test :: iNum = %d\n", iNum);
   
    printf( "main :: iA : %d\n", iA);
    printf( "main :: iB : %d\n", iB);
    printf("main :: end!!------\n");  
 
    return;
}

test.h

#ifndef __TEST_H__
#define __TEST_H__

extern int iB;

void test(int);

#endif

출력 결과를 보자

 

 mc.png

 

 분할 컴파일 과정

1. gcc -c *.c   (.o파일 생성)
2. gcc -o main *.0

3. gcc -o main *.c (위의 1, 2번 과정을 동시에 함)

static의 두 가지 의미

1. 전역 변수처럼 취급된다. (지역 변수로 사용시)

2. 다음 파일에서 접근할 수 없는 전역 변수가 된다. (전역 변수로 사용시) - 접근속성

static 클래스와extern 클래스는 auto 클래스나 register 클래스와는 달리 함수의 실행이 끝난 뒤에도 남아있는 변수다.

static 클래스는 함수의 내부에서나 외부에서 모두 선언될 수 있고 extern 클래스는 함수의 외부에서만 선언된다.

static 변수는 초기화를 하지 ㅇ낳아도 시스템에 의해서 자동적으로 0이나 NULL로 초기화 된다.