본문 바로가기
Language&Framework&Etc/C

파일의 분할과 헤더파일의 디자인(27-1) 파일의 분할

by 머리올리자 2020. 12. 18.

파일을 그냥 나눠도 될까요?

파일을 나누는 이유도 서랍장과 비슷하다. 파일을 나눠서 각각의 파일에, 용도 및 특성 별로 함수와 변수를 나눠서 저장하면 소스코드의 관리가 용이해진다.

 

프로그램을 나누는 방법을 고민

 

예시

#include <stdio.h>
/*======num.c========*/
int num = 0;
/*===================*/


/*======func.c=======*/
void increment(void)
{
	num++;
}

int getnum(void)
{
	return num;
}
/*===================*/

/*======main.c=======*/
int main(void)
{
	printf("num: %d \n", getnum());
	increment();
	printf("num: %d \n", getnum());
	increment();
	printf("num: %d \n", getnum());

}
/*===================*/

만약 위 주석처럼 총 세 파일로 나눠서 저장한다고 가정.

 

컴파일이 제대로 됨?

 

안됨

 

컴파일할 때 에러가 발생

 

이는 컴파일러의 다음과 같은 특성

 

"컴파일러는 파일 단위로 컴파일을 진행"

 

다른 파일의 정보를 참조하여 컴파일을 진행하지 않는다.

 

때문에 위 그림의 파일 func.c를 컴파일 하면 변수 num을 찾지 못함

 

또한 main.c에서 increment 함수를 찾지 못함

 

외부에 선언 및 정의되었다고 컴파일러에게 알려줘야 함

"num은 외부 파일에 int형으로 선언된 변수!"

"increment는 반환형과 매개변수의 형이 void인 함수, 외부 파일에 정의"

 

따라서 변수 num이 필요한 func.c 파일에는 다음의 선언이 삽입되어야 함

extern int num; // int형 변수 num이 외부에 선언되어 있다.

extern은 int형 변수 num이 외부에 선언되었음을 컴파일러에게 알릴 때 사용되는 키워드.

 

즉 변수 num을 할당하는 것이 아닌, num 의 자료형이 무엇이고, 어디에 선언되어 있는지를 컴파일러에게 알려주는 메세지.

 

main.c에는 아래의 선언이 삽입되어야 함

extern void Increment(void); // void Increment(void) 함수가 외부에 정의되어 있다.

참고로 함수가 외부에 정의되어 있음을 알릴 때에는 extern 선언을 생략 가능.

 

다음과 같이 선언해도 동일한 메세지가 컴파일러에게 전달

void Increment(void);

다른 파일에서 접근을 못하게 하고 싶다면 static!

함수 내에 선언된 지역변수에 static 선언이 붙으면,

(chapter 9 中)

  • 선언된 함수 내에서만 접근이 가능(지역변수 특성)
  • 딱 1회 초기화되고 프로그램 종료 시까지 메모리 공간에 존재한다 (전역변수 특성)

전역변수 static은 다음의 의미를 담고 있다.

 

"이 변수는 외부 파일에서의 접근을 허용하지 않는다."

 

다소 전문적으로 표현하면

 

"이 변수의 접근범위는 파일 내부로 제한한다."

static int num=0;

따라서 num.c에서 선언된 변수 num을 위와 같이 static 변수로 선언하면 외부에서 변수 num에 접근할 수가 없다.

 

참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.