파일의 분할
코드 파일의 크기가 커지면
분할하여 사용하는 것이 합리적이다.
책에 예시로 나와 있듯이 서랍장 하나에 다 박아두는 것보다,
여러 서랍장에 용도별로 나누는 것이 더 효율적이기 때문.
다만 파일을 여러 개로 나눈 경우,
컴파일 시 파일 하나 하나 개별적으로 컴파일이 진행되므로
해당 파일 내에서 선언되지 않은 함수나 변수는 ( 다른 파일에서 선언했으나 해당 파일에서 사용되는)
extern 선언을 해 줘야 한다.
(참고로 여러 파일을 묶어서 하나의 프로그램으로 컴파일을 할 때, 본체는 main 함수가 들어 있는 파일이라고 생각한다.)
extern int a;
extern void PrintHello(void);
int main(void)
{
int b = a;
PrintHello();
return 0;
}
들여쓰기가 이상한 것은 무시해주길 바란다. 코드블럭 문제인듯..
아무튼 위와 같이 쓰인 경우 변수 a 나 함수 PrintHello() 가 해당 파일에서 선언되지 않았다고 하더라도
문제 없이 컴파일이 된다.
다만 다른 파일에서 참조할만한 적절한 변수나 함수가 있어야 할 것이다.
또한 전역변수나 함수의 static 선언은 자바에서의 그것과 같은 역할을 할 수 있다.
static 선언이 붙은 전역변수/함수는 외부에서 참조할 수 없다.
--------------------------------------
여러 파일을 묶어서 컴파일 하는 방법.
요즘 나오는 최신 IDE들은 그냥 프로젝트 안에 소스 파일을 전부 둘 수 있는 공간이 마련되어 있다.
그곳에 파일이 몇개든 두기만 하면 알아서 컴파일을 해준다.
다만 필자와 같은 약간 클래식한 방법으로 컴파일을 한다면,
(현재 윈도우 WSL 기능으로 리눅스 시스템에서 vim 에디터와 gcc 를 이용해 C를 공부하는 중)
gcc 옵션을 이용해 파일 하나하나 .o 파일로 만들어준 뒤,
이를 또 옵션을 이용해 묶어서 컴파일 해야 한다. 이에 대한 내용은 구글링을 해보면 아주
이해쉽고 자세하게 잘 설명된 블로그들이 많이 나온다.
===========================================================
헤더파일의 디자인과 활용
헤더파일은 중요해 보인다.
라이브러리도 그렇고 뭐 이건 여기 저기 활용성도 그렇고
다른 언어를 하더라도 C의 헤더파일 개념과 비슷한 것이 항상 있기 때문에
어느 정도 꼼꼼히 배워둘 필요가 있다.
#include + 헤더 파일
위의 형태로 쓰이는데, 해당 헤더 파일 내용을 복붙해 넣는다는 뜻이다.
코드의 어느 위치에서든 #include + 헤더파일을 넣는다면 해당 파일의 내용을 가져와서 붙여넣어준다.
단, 헤더파일을 include 하는 방식은 두 가지가 있다.
#include <file.h>
// <> 로 묶어주는 방식은 stdio/stdlib/math 등등 표준 헤더파일을 포함시키는 경우 사용
#include "file.h"
// "" 로 묶어주는 방식은 표준이 아닌 싸제 헤더파일을 포함시킬 때 사용
// 내용으로 절대경로나 상대경로를 지정할 수 있으나
// 웬만하면 상대경로로 지정하는 것이 좋다.
헤더파일의 필요성
헤더파일을 왜 포함시키는가?
앞에서 봤던 파일의 분할에서는 외부의 변수나 함수들을 extern 선언하여 참조했었다.
이를 헤더 파일로 대신할 수 있다. (헤더 파일에 변수나 함수 선언)
또한 헤더 파일마다 각각의 역할을 부여하여 필요한 순간마다 사용할 수도 있다.
파일 안의 내용을 붙여넣기 때문에 공산품을 만들듯이 미리 틀을 만들어 놓는 것이다.
주의할 점
구조체 선언에 주의하여야 한다.
소스 파일에 헤더 파일을 포함시키고,
그러한 소스 파일들을 묶어서 컴파일하고 등등
복잡한 포함관계를 거치면서 자칫 구조체 선언이 중복될 수가 있다.
구조체 선언이 중복된다면 컴파일 에러가 발생하게 된다.
또한 이러한 상황에서든, 헤더 파일의 중복 포함은
정상적인 상태가 아니라고 생각한다. 그래서 헤더 파일을 한 번씩만 포함시키는 기술이 필요하다.
헤더파일의 중복삽입을 방지하기 위해서
전 게시글에서 배운 매크로 명령을 이용한다.
바로 #ifndef 명령을 이용하는 것.
#ifndef HEADER
#define HEADER
/*
.
.
.
*/
#endif
위와 같이 설계를 해 둔다면 헤더 파일의 중복 삽입을 막을 수 있다.
'프로그래밍 > C*' 카테고리의 다른 글
(C) 매크로와 선행처리기 (0) | 2022.03.03 |
---|---|
C에서 메모리의 동적 할당 (0) | 2022.03.01 |
댓글