프로그래밍 언어/C++

헤더 파일과 소스 파일 나누기

readme.md 2023. 3. 16. 09:26

인프런 홍정모의 따라하며 배우는 C++선언과 정의의 분리를 비주얼 스튜디오 코드에서 적용하는 방법을 정리

1. 헤더 파일과 소스 파일

코딩 테스트를 연습한다던가 책이나 강의에 나와있는 간단한 예제들을 타이핑 할 때는 main 함수가 포함되어 있는 파일 하나로 충분한 경우가 많이 있다. 그러나 프로그램의 규모가 커지게 되면 하나의 파일로 감당이 어렵기 때문에 자연스럽게 파일을 분리하게 될 것이다. C++에서는 헤더 파일과 소스 파일로 분리를 할 수 있다.

 

우선 함수의 선언과 정의가 모두 하나의 파일 안에 있는 경우를 살펴보자.

// main.cpp
#include <iostream>

using namespace std;

int add(int x, int y);

int main()
{
  cout << add(1, 2) << endl;

  return 0;
}

int add(int x, int y) { return x + y; }

main.cpp에는 두 개의 숫자를 더해주는 add라는 함수가 함께 정의되어 있다. add라는 함수를 별도의 헤더 파일과 소스 파일로 나누어 보자.

// main.cpp
#include "add.h"
#include <iostream>

using namespace std;

int main()
{
  cout << add(1, 2) << endl;

  return 0;
}

// add.h
#pragma once

int add(int x, int y);

// add.cpp
int add(int x, int y) { return x + y; }

이제 main.cpp 파일에는 #include 전처리기를 사용해서 add.h라는 헤더 파일을 포함시킬 수 있게 된다. 그리고 add.h에 선언되어 있는 add라는 함수의 구현부는 add.cpp 파일에 존재한다.

 

하나의 파일에 존재하던 코드들이 여러 파일로 나누어졌기 때문에 컴파일을 통해 생성된 각 파일의 오브젝트 파일이 링커를 통해 합쳐져야 한다.(main.o + add.o => executable) 비주얼 스튜디오 코드의 Code Runner 익스텐션을 사용하면 단일 파일에 대한 컴파일 설정만 되어 있어서 헤더 파일, 소스 파일이 분리되어 있으면 오류가 발생한다. 이런 경우에는 Makefile을 사용해서 여러 개의 파일들을 컴파일 처리하면 편하다.

2. Makefile

/Project
    - /main.cpp
    - /add.h
    - /add.cpp

main.cpp 파일이 포함되어 있는 프로젝트의 구조가 위와 같다면 /Project 경로 아래에 다음과 같은 Makefile을 만들어 준다.

Makefile 사용법 :
https://bowbowbow.tistory.com/12
http://doc.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make-7.html

# Makefile

CC = g++
CXXFLAGS = -W -Wall

OBJS = main.o add.o

TARGET = main

all: $(TARGET)

$(TARGET): $(OBJS)
    $(CC) $(CXXFLAGS) -o $@ $^

run: main
    ./main

.PHONY: clean    
clean:
    rm -f main $(OBJS)
  • CC: 사용할 컴파일러 지정
  • CXXFLAGS: C++ 컴파일러에 전달할 컴파일 옵션 지정
  • OBJS: 오브젝트 파일의 이름들
  • all: make를 실행했을 때 실행되는 룰
  • $@: 현재 룰의 이름(main)
  • $^: 현재 룰이 의존하는 파일들의 이름(main.o add.o)

$(TARGET): $(OBJS) 룰에서 $(TARGET)$(OBJS)에 의존하고 있기 때문에 make를 실행하는 순간 OBJS에 포함되어 있는 오브젝트 파일이 없다면 Make가 의존하는 파일들을 먼저 빌드하여 main.o, add.o 파일이 생성될 것이다. 그리고 g++ -W -Wall -o main main.o add.o 명령이 실행된다.

 

make 명령을 실행했을 때, missing seperator 오류가 발생하면 Makefile 작성을 할 때 탭이 아니라 스페이스가 들어간 경우다. 탭을 사용했는데도 같은 문제가 발생하면 사용하는 에디터에서 탭을 스페이스 4개로 변환하는 것이 아니라, 탭 그대로 사용하도록 수정해주면 된다.