C 프로그래밍/7. 함수와 변수

7.3 외부 연결(extern), 각종 저장 유형

Recircle 2019. 6. 18. 18:35

다른 범위에 속하는 변수들을 서로 연결하는 것을 의미합니다. C언어에서는,


1. 무연결 : 지역 변수로서 위부와 연결을 가지지 않음.

2. 외부 연결 : 전역 변수로서 여러 개의 소스 파일에 걸쳐서 사용됨.

3. 내부 연결 : 전역 별수로서 하나의 소스 파일에서만 사용이 가능함.


3개의 연결이 유효합니다.



외부 연결


여러 개의 소스 파일(source1.c , source2.c 등 여러개의 소스파일) 에서는 하나의 파일에서는 int i = 0;과 같이 일반적으로 선언해주고

다른 외부 파일에서는 extern int i = 0; 과 같이 앞에 extern을 넣어줍니다.


extern이 의미하는바는 이 함수는 다른 소스파일에 이미 만들어져있으므로 그것을 참조한다. 라고 이해하시면 좋습니다. 만약 extern 키워드를 사용하지 않을시에는 전역 변수가 외부 연결 가능하다고 해도 다른 소스 파일에서 참조가 불가능함에 유의하여야하며, extern를 넣어야만 컴파일러가 변수의 타입을 인식가능합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
//linkage1.c
 
#include <stdio.h>
int all_files;
static int this_file;
extern void sub();
 
int main()
{
    sub();
    printf("%d\n", all_files);
    return 0;
}
cs

1
2
3
4
5
6
7
//linkage2.c
 
extern int all_files;
void sub(void)
{
    all_files = 10;
}
cs
linkage1에서 이미 all_files를 정의하였으므로 linkage2.c에서는 참조만 하면됩니다. 그렇기에 linkage2에서 all_files를 10으로 초기화하면 linkage1에있는 all_files의 값이 10으로 바뀝니다.


내부 연결


전역 변수 앞에 static이 붙으면 내부 연결입니다. 하나의 소스 파일에서만 사용이 가능합니다.

위의 2개의 소스파일에서 static int this_file은 내부 연결로써 linkage2.c 에서 extern를 이용한 참조가 불가능함을 알아야합니다.




C에서 사용 가능한 변수의 저장 유형

저장 유형 

키워드 

정의되는 위치 

범위 

생존 시간 

자동 

auto 

함수 내부 

지역 

임시 

레지스터 

register 

함수 내부 

지역 

임시 

정적 지역 

staic 

함수 내부 

지역 

영구 

전역 

없음 

함수 외부 

모든 소스 파일 

영구 

정적 전역 

static 

함수 위부 

하나의 소스 파일 

영구 

외부 참조 

extern 

함수 외부 

모든 소스 파일 

영구 

-일반적으로는 자동 저장 유형을 사용하는 것이 권장됩니다. 알아서 생성되고 소멸되므로 메모리를 효율적으로 사용하게 도와주고, 독립적으로 설계가 가능합니다.


- 자주 사용되는 코드는 register함수를 사용하는것이 좋습니다. cpu의 캐시에 상주되기때문에. 속도가 아주빠르지만,  개수가 제한되더있고, 지역 변수만 선언이 가능하다, 그리고 주소가 없기때문에 &를 사용해서는 안된다.