본문 바로가기

C++

C++에서 헤더와 소스 (.h/.hpp vs .cpp)

728x90

헤더와 소스

C++ 프로젝트에서는 다음과 같이 헤더와 소스가 분리된 모습을 볼 수 있다.

 

// Vector.h
#ifndef VECTOR_H
#define VECTOR_H

class Vector {
private:
    double x, y;

public:
    Vector(double x, double y);
    double length() const;
};

#endif

 

// Vector.cpp
#include "Vector.h"
#include <cmath>

Vector::Vector(double x, double y) : x(x), y(y) {}

double Vector::length() const {
    return std::sqrt(x * x + y * y);
}

 

C++에서는 헤더 파일과 소스 파일을 따로 분리하는 것이 일반적이며 역할도 다르다.

  • 헤더: 선언(Declaration)을 포함한다. 선언은 함수와 클래스에 대한 존재 자체를 알려주는 것이다.
  • 소스: 정의(Definition)을 포함한다. 선언된 것들의 실제 동작을 구현한다.

 

여러 헤더를 쓰다보면 기반이 되는 헤더가 겹치는 경우가 있는데, 헤더를 중복 정의함으로써 생기는 에러를 방지하기 위한 방법이 두 가지 존재한다.

Include Guard

Include Guard는 같은 헤더가 두 번 이상 include 되는 걸 방지한다.

 

Vector.h에서 다음과 같이 되어있는 걸 볼 수 있다.

// Vector.h
#ifndef VECTOR_H // VECTOR_H가 선언되어있지 않다면
#define VECTOR_H // VECTOR_H를 선언함
#endif

 

이는 VECTOR_H 매크로가 없을 경우에만 VECTOR_H 매크로를 정의하는 것으로 이해할 수 있다.

#pragma once

Include Guard 대신 요즘 쓰는 표기로 이해할 수 있다.

 

심지어 한 줄이면 끝난다.

#pragma once

 

 

 

 

 

728x90