지난 시간에는...
지난 시간에는 어떤 게 알아보기 어려운 코드인지, 그 문제점을 알아보았다. 또 그걸 해결하기 위한 "코드 깔끔하게 짜는 법"을 알아보았다.
"한 파일안에 코드 줄 수가 너무 많다고요? 그러면 나더러 어떻게 하란거에요. 뭐 다른 방법이 있나요?"
오늘은 이 질문에 대한 답변을 하는 시간을 갖도록 한다.
자, 저번에서 그 한 파일에 있던 코드들을 1. 배열을 이용한 함수, 2. 연결리스트를 이용한 함수, 3. 메인함수와 그 외의 함수라는 총 3가지의 분류로 나누어, 각각을 따로 파일에 담았다하자. 그럼에도 아직 문제가 남아있다.
"파일을 여러 개로 나눠요? 그러면 main.c 파일에서 어떻게 다른 파일의 함수를 읽어오나요? 게다가 컴파일은 어떻게 해요?"
사용자 정의 헤더파일
우선, 코드를 길게짜는 사람이라면, 함수의 원형을 main문 위쪽에 선언해주는 방법을 아마 알 것이다.
#include <stdio.h>
void hello(); // 반환값이 없는 hello 함수 원형 선언
int main()
{
hello(); // hello 함수 호출
return 0;
}
void hello() // 반환값이 없는 hello 함수 정의
{
printf("Hello, world!\n"); // Hello, world! 출력
}
main문에서 위쪽에 함수를 선언해주면, 어느 위치에 함수가 오더라도 메인에서 이 함수를 읽어들여 프로그램을 돌릴 수 있다.
파일을 여러개로 나눌 경우에도 마찬가지다. 함수 파일마다 내 전체함수들의 프로토타입과 사용되는 구조체를 전부 상단에 넣어주면 될 것 같다. 근데 그러면 깔끔하지가 않다... 방법이 없을까?
이 경우 쓰게 되는 게 사용자 정의 헤더파일이다.
C언어 기초 - 헤더파일 만드는 방법과 사용하는 방법
본문 목표 프로젝트가 복잡하고 규모가 클 수록, 코드가 많이 길어지게 된다. 코드가 길어지면 가독성이 떨어지게 된다. 가독성이 떨어지면, 코드 개발이 복잡해지고, 오류가 발생할 확률이 높
diyver.tistory.com
위 블로그를 참고하면 좋다.
헤더 파일 예시
#ifndef _EXAMPLE_H_
#define _EXAMPLE_H_
/*
* include할 헤더 목록 적기
*/
typedef struct 구조체 명
{
...
} 구조체;
int 함수1();
int 함수2();
void 함수3();
void 함수4();
#endif
다음과 같은 방식으로 헤더파일에 모든 include할 헤더목록, 구조체명, 내가 사용한 모든 함수의 프로토타입을 적어준다.
해당 파일의 이름을 example.h라고 저장했다고 해보자.
그럼 내가 가진 모든 C 소스 파일의 위쪽에 모두 #include "example.h" 라는 선언을 한줄만 추가해주면 된다.
그럼 모든 파일의 상단에 내가 사용할 구조체&함수들을 전부 선언해놓은 것과 동일한 효과가 난다!
여기에서 #include <example.h>가 아닌, "example.h"로 따옴표를 사용해줘야만 한다. 사용자가 정의한 이런 헤더파일은 원칙적으로 따옴표를 써야하기 때문이다.
그럼 이제, 어떻게 main 파일에서 다른 파일의 함수들을 읽어오냐는 질문에 대한 답변은 끝이 났다.
그러면 이제 남은 질문은?
그렇게 여러 개로 나눠진 파일들을 어떻게 묶어서 컴파일 해요?
이거다.
다음 포스팅에서 이어서 이것을 설명하도록 하겠다.
다음 포스팅에서는 컴파일의 대략적인 과정과, 컴파일러, 컴파일 명령어 그리고 makefile에 대해 배운다.
'IT > 왕초보 강의' 카테고리의 다른 글
[짱 중요한 팁] 소스 파일 하나에 몇 백, 몇 천줄의 코드를 몰아넣는 그대에게 - 1편 (feat. 코드 깔끔하게 짜기) (0) | 2021.12.19 |
---|---|
[Github] 깃허브 왕초보 사용법 - 기본편3 (0) | 2021.12.19 |
[Github] 깃허브 왕초보 사용법 - 기본편2 (0) | 2021.12.19 |
[Github] 깃허브 왕초보 사용법 - 기본편1 (1) | 2021.12.19 |