wrkbrs
[C 언어] [분할컴파일] 다른 소스파일의 전역변수 데이터 공유 본문
분할 컴파일
분할 컴파일이란 두 가지 이상의 소스코드 파일을 한꺼번에 컴파일하는 것을 말한다. 이렇게 여러 가지 소스파일로 분할하여 관리한다면 업그레이드한다거나 에러를 잡거나 디버깅하기가 쉬워진다. 실제로도 하나의 소스파일에 작성하는 경우는 정말 간단한 프로그램이 아니고서는 거의 없다.
먼저 main.c 파일부터 살펴보자.
//main.c #include <stdio.h> #include <stdlib.h> int sum(int a, int b); int main() { printf("합계는 : %d \n", sum(1,2)); system("pause"); return 0; }
main.c 파일에는 sum이라는 함수가 선언되어 있지만 정의되어 있지 않는다. 정의되어 있지 않아 무슨 일을 하는 함수인지 이름과 매개변수를 보고 짐작할 수밖에 없다. 이름이 sum 인걸 보아 분명 덧셈을 해주는 함수 일 것이다.
다음은 sum.c이다
//sum.c int sum(int a, int b); int sum(int a, int b) { return a + b; }
sum 함수만 선언과 정의되어 있는 걸 볼 수 있다. sum은 두 숫자를 덧셈해주는 함수이다. 이렇게 두 개의 소스파일로 구성되어 있고 두 개의 소스파일들이 컴파일되어 목적 파일로 바뀌고 두 개의 목적 파일들이 실행파일이 된다. 이 내용은 다음시간에 컴파일이라는 주제로 살펴보자.
다른 소스파일의 전역변수 데이터 공유
컴파일러는 소스파일 단위로 컴파일하기 때문에 다른 소스파일에 선언되어있는 전역 번수를 모른다. 이 때문에 예약어인 static과 extern을 사용하여 전역변수를 공유할지 공유하지 않을지 정한다.
1. 이해하기
// main.c int cnt; // 일반 전역변수 선언 static int cnt2; // 정적 전역변수 선언
//sum.c extern int cnt; // cnt가 다른 소스파일에 있으니 전역변수를 만들지 말고 찾아서 써라. int cnt2; /* main.c에 있는 cnt2는 정적 전역변수 이기 때문에 공유가 되지 않아 새로운 전역변수 cnt2를 만듬 */
가장 중요한 포인트는 extern으로 선언할 경우 새로운 전역변수를 생성하는 것이 아니고 '다른 소스파일에 이미 정의되어 있으니 찾아가서 써라'는 뜻이고. static은 '다른 소스파일에서는 이 변수에 접근하지 못한다.' 라는 뜻이다. 그러므로 static으로 선언한다면 다른 소스파일에서 동일한 변수명을 사용해도 중복 에러가 발생하지 않지고 extern는 한 개의 변수를 공유해서 사용하기 때문에 초기화를 할 수 없다. ※대부분의 컴파일러가 static을 선언하지 않으면 extern으로 간주 됨
2. 사용하기
// main.c #include <stdio.h> #include <stdlib.h> int sum(int a, int b); static int cnt2; int cnt; int main() { printf("첫번째 합계는 : %d \n", sum(1, 2)); printf("두번째 합계는 : %d \n", sum(1, 3)); printf("세번째 합계는 : %d \n", sum(1, 4)); printf("총 sum함수를 실행한 수 : %d \n", cnt); printf("cnt2 : %d \n", cnt2); system("pause"); return 0; }
//sum.c int sum(int a, int b); extern int cnt; int cnt2; int sum(int a, int b) { cnt++; cnt2++; return a + b; }
아까와 똑같은 예제에서 cnt2를 추가했다. main.c에서는 cnt2를 선언만 했으므로 cnt2 = 0이다. [main.c cnt2 = 0] sum.c에도 cnt2를 선언했다. 앞에 static이 명시되지 않아 extern으로 간주되어 다른 소스파일에서 선언된 cnt2를 찾는다. 하지만 main.c에서는 static으로 선언되었기 때문에 공유할 수 없으므로 cnt2 변수를 만든다. [sum.c cnt2 = 0]
이제 실행 순서를 알아보자 처음 메인 함수가 실행되고 cnt와cnt2변수를 만든다 그리고 sum함수를 총 3번 수행하게 되는데 한번 수행할 때마다 cnt과 cnt2를 1씩 증가시킨다. [sum.c cnt = 1][sum.c cnt2 = 1] 그리고 a+b를 메인 함수에게 반환하게 되는데 이것을 3번 반복하게 되면 cnt와 cnt2는 3이 될 것이다. [sum.c cnt = 3][sum
.c cnt2 = 3] 그리고 메인문에서 cnt와 cnt2를 출력하게 되는데 여기서 cnt는 sum.c의 cnt와 공유 데이터이므로 3을 출력하게 된다. [sum.c cnt = 3] 그 후 cnt2를 출력하게 되는데 cnt2는 아무도 접근할 수 없는 main.c의 변수이므로 sum.c의 cnt2와 다르기 때문에 [main.c cnt2 = 0]를 출력하게 된다.
본 글의 모든 저작권은 http://blog.naver.com/white_cap 에 있습니다.
[출처] [C언어][분할컴파일] 다른 소스파일의 전역변수 데이터 공유|작성자 Mark J
'C' 카테고리의 다른 글
[C언어 강의37] 파일 입출력 -3 (fgets, fputs) (0) | 2019.10.04 |
---|---|
문자열 입력 함수 fscanf(), fgets() (0) | 2019.10.04 |