[C언어] 10. 파일의 분할과 헤더파일 디자인(END)




제가 책(윤성우의 열혈 C 프로그래밍)을 보다가 까먹었던 부분만 포스팅 하는 것입니다!

순서가 뒤죽박죽이어도 이해해주세요~~!

파일의 분할



프로그램의 크기가 커지면 관리하기가 어려워 많은 경우 여러 개의 파일을 만들어서,

서로 연관 있는 함수와 변수들을 구분해놓습니다.

컴파일러는 파일 단위로 컴파일을 진행하기에 다른 파일의 변수에 접근하려면,

컴파일러에게 변수가 외부에 선언 및 정의되었다고 알려줘야 합니다!

이 때 사용하는 키워드가 extern 입니다.

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

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

//헤더파일에서는 함수원형만 쓰면되고, extern을 안 써도 됩니다.



컴파일러에게는 extern 선언을 통해서

함수 또는 변수가 외부에 선언 및 정의되어 있다는 사실만 알리면 됩니다.

구체적으로 어느 파일에 선언 및 정의되어있는지 까지는 알리지 않아도 됩니다~!

다른 파일에서 변수나 함수에 접근하는 걸 못하게 하고 싶다면 static을 이용합니다!


static int num; //다른 파일에서 extern으로 num에 접근을 못함

static void Min(void)
{
	cnt--;
} //다른 파일에서 extern으로 이 함수에 접근 못함



헤더파일의 디자인과 활용



#include 지시자는 파일에 저장된 내용을 가져다 놓는다고 생각하면 됩니다.



예를 들어서 3개의 파일이 있다고 합시다

header1.h


{
	printf("hello world!");



header2.h


	return 0;
}



main.c


#include <stdio.h>

int main(void)
#include "header1.h"
#include "header2.h"



그러면 선행처리기에 의해 main.c는 다음과 같아집니다


#include <stdio.h>

int main(void)
{
	printf("hello world");
	return 0;
}



위에서 보시듯이 #include는 그저 저장된 내용을 해당 위치에 가져다 놓는 역할을 합니다~!

헤더파일을 include 하는 방법은 두 가지가 있습니다.


#include <헤더파일 이름> //첫번째 방식

#include "헤더파일 이름" //두번째 방식



이 둘의 차이점은 포함시킬 헤더파일의 기본 경로인데,

첫 번째 방식을 사용하면 표준 헤더파일이 저장되어 있는 디렉터리에서

파일을 찾게되고,

두 번째 방식을 사용하면 이 문장을 포함하는 소스파일이 저장된 디렉터리에서

헤더파일을 찾습니다.

따라서 두번째 방식은 프로그래머가 직접 헤더파일을 작성할 때 사용됩니다.

그리고 헤더파일을 선언할 때는 절대경로말고 상대경로를 사용해야합니다.

절대경로로 하는 경우 컴퓨터가 옮겨질 때 컴파일이 안 될수도 있기 때문입니다.



헤더파일 중복 해결



구조체 선언 및 정의는 헤더파일에 삽입하는 것이 좋습니다.

그러나 하나의 소스파일내에서만 사용이 되는 구조체라면 소스파일에 저장하는 것이 좋습니다.

그리고 구조체는 중복해서 선언된 경우는 컴파일 에러가 발생합니다~!




헤더파일을 중복해서 삽입하는 자체는 문제가 되지 않지만,

헤더파일 내에 선언된 구조체를 중복해서 선언하는 것은 문제가 됩니다.

따라서, 헤더파일을 중복 삽입하는 것을 막아야 하는데요~

이전에 배웠던 #ifndef ... #endif 를 이용합니다!!



헤더파일을 다음과 같이 작성합니다~


#ifndef __KOO_H__ //KOO가 정의 안되었는지 확인

#define __KOO_H__ //안되었으면 정의하고, 헤더파일 내용을 가져다 놓습니다.

typedef struct 
{
	int quotient;
	int remainder;
}Div;

#endif



헤더파일을 #ifndef ..#endif를 사용하여 작성하면,

헤더파일을 중복해서 삽입하는 걸 막을 수 있습니다~!



드디어 C언어 책을 다시 다 보게 되었어요~!!!

오랜만에 봐서 기억안나는 부분이 많네요 ㅠㅠ

까먹을 때마다 블로그 와서 봐야겠습니다ㅋㅋㅋㅋㅋㅋ

제가 정리한 것이 누군가에게도 도움이 되었으면 좋겠네요!!

그럼 다음 포스팅에서 뵙겠습니다!!