본문 바로가기

윤성우의 C Programming

Chapter 27. 파일의 분할과 헤더파일의 디자인

1. 파일의 분할 

수납장이 하나보다는 여러개가 있으면 관련있는 물건을 수납장별로 보관할 수 있는 것처럼 파일도 여러 곳이 용도 별로 저장해두면 효율적으로 사용할 수 있다 .그런데 단순히 파일을 나눠놓기만 하고 컴파일러에게 파일이 나눠져있다는걸 알려주지 않으면 컴파일 오류가 날 것이다. 컴파일러는 파일 단위로 컴파일을 진행하기 때문이다. 이때 필요한 것이 extern 선언이다. 

extern int num;

// 컴파일러야 int num 은 외부 파일에 있어

 

다른 파일에서 접근 못하게 하려면 static ! 

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

 

2. 둘 이상의 파일을 컴파일하는 방법과 static에 대한 고찰 

 

방법 1 : 이미 만들어진 파일을 프로젝트에 추가

방법 2:  프로젝트에 파일을 추가한 다음 코드를 삽입하여 컴파일  

 

함수에도 static 선언이 가능하다. 

static void MinCnt(void)
{
   cnt--;
}

아래와 같이 선언해두면, extern 선언을 해도 외부에서 파일에 접근할 수가 없다 

 

2. 헤더파일의 디자인과 활용 

#include 지시자의 의미는 파일의 내용을 단순히 포함시키는 용도로 사용한다. 그 이상도 그 이하도 아닌 단순한 '포함'일 뿐이다. 이러한 헤더파일을 포함시키는 방법은 두 가지가 있다. 

1) 헤더파일을 포함시키는 두 가지 방법 

방법 1 

#include <헤더파일 이름>

 

방법 1을 사용하면 표준 헤더파일이 저장되어 있는 디렉터리에서 파일을 찾게 된다. 보통 표준 헤더파일을 포함시킬 경우 사용된다. 

 

 

방법 2 

#include "헤더파일 이름"

방법 2를 사용하면 이 문장을 포함하는 소스파일이 저장된 디렉터리에서 헤더파일을 찾는다. 때문에 프로그래머가 정의하는 헤더파일을 포함시킬 때 사용하는 방식이다. #include 문에서는 절대경로를 사용하지 않는다. 왜냐하면 절대경로를 지정해서 헤더파일을 사용하면 다른 컴퓨터에서 컴파일 하는 일이 매우 번거로워지기 때문이다. 

2) 구조체 정의 시 중복은 안된다. 

구조체의 정의는 소스파일일까 헤더파일일까? 정답은 헤더파일이다. 동일한 구조체의 정의가 두 군데 이상 존재하면 구조체의 수정과 확장에 불편함이 따르기 때문에 헤더파일을 별도로 만들어서 구조체의 정의가 중복으로 일어나지 않도록 해야한다. 

 

3) 헤더파일 중복 삽입의 문제 

헤더파일의 중복삽입 자체는 문제가 되지 않는다. 왜냐하면 컴파일러에게 같은 메시지 두번 보내는 것 그 이상 이하도 아니기 때문이다. 하지만 헤더파일 안에 구조체가 포함되어 있고 헤더파일 중복 삽입으로 인해 구조체가 중보긍로 삽입이 되었다면 이는 큰 문제로 이어질 수 있다 왜냐하면 구조체 정의는 컴파일을 하는데 도움을 주는 정보가 아니라 실행파일의 내용에 직접적인 연관이 있는 정보이기 떄문이다. 구조체를 어떻게 정의하느냐에 따라 실행파일의 크기뿐만 아니라 실행파일의 내용도 달라질 수 있다. 

 

이 문제를 해결하기 위해서는 아래 구문을 통한 조건부 컴파일을 활용하면 된다. 

#ifndef ~#endif

<예시> 

#ifndef FILE1
#define FILE2

typedef struct div 
{
int quotient;
int reminder;
} Div;

#endif