C++ :: 소스파일, 헤더파일(*.h) 분리 예제
공부하고 있는 C++ 헤더 개념을 정리하는 글을 써보았습니다. 우선 파일 구조는 다음과 같습니다.
hero.h // class Hero의 헤더 파일
hero.cpp // class Hero의 구체적 소스 코드
main.cpp // 메인 파일
hero.h
#ifndef HERO_H
#define HERO_H
class Hero
{
string name;
short HP;
public:
Hero();
Hero(string name, short HP);
void info();
void set_info(string name, short HP);
};
#endif
헤더 파일 맨 위에 #ifndef, #define, 그리고 마지막 줄에 #endif가 있습니다. 이건 헤더파일을 컴파일러가 호출할 때 여러번 호출되지 않게끔 하는 기능을 갖고 있습니다. 연습용 짤막한 코드에선 없어도 상관 없지만, 프로젝트가 복잡해질수록 반드시 필요해집니다. Preprocessor라고도 부릅니다.
뜻을 풀자면 만약 HERO_H가 정의되어 있지 않다면, 이하의 코드(#endif 전까지의 코드), 즉 헤더 파일의 코드를 HERO_H로 정의(#define)하라. (만약 HERO_H가 정의되어있다면 넘어가라.) 정도가 되겠네요. 여기서 HERO_H는 토큰 이름인데, 관습적으로 헤더파일명 대문자 + “_H”를 쓰는 듯 합니다.
그리고, 클래스 정의 마지막에 세미콜론(;) 붙이는 걸 까먹으시면 안됩니다.
hero.cpp
#include <iostream>
using namespace std;
#include "hero.h"
Hero::Hero(){} // when there's no parameter
Hero::Hero(string name, short HP) // overloading constructor based on params
{
this->name = name;
this->HP = HP;
}
void Hero::info()
{
cout << "--------------------" << endl;
cout << "name: " << this->name << endl;
cout << "HP: " << this->HP << endl;
}
void Hero::set_info(string name, short HP)
{
this->name = name;
this->HP = HP;
}
Hero 클래스에 대한 구체적 정의가 담긴 파일입니다. 3번째 줄에서 hero 헤더파일을 include하는데, 파일 명을 꺽쇠(<)가 아니라 쌍따옴표(“)로 감싸주셔야 에러가 나지 않습니다. 보통 꺽쇠는 (iostream처럼) 시스템 PATH에서 검색하고, 쌍따옴표는 현재 디렉토리에서 해당 파일을 찾기 때문입니다.
main.cpp
#include <iostream>
using namespace std;
#include "hero.h"
int main()
{
Hero Tracer("Tracer", 150), Pharah("Pharah", 200), Mercy;
Pharah.info();
Mercy.set_info("Mercy", 200);
Mercy.info();
}
여기서도 헤더파일명은 꺽쇠(<)가 아닌 쌍따옴표(“)로 감싸줍니다.
컴파일 하기
> g++ main.cpp hero.cpp -o main
Sublime Text 3의 기본 c++ 빌드는 에러가 날 수 있습니다. 상기의 코드는 메인 파일과 Hero 클래스의 정의가 담긴 hero.cpp를 둘 다 컴파일 하지만, 섭라임 상에서는 main.cpp만 컴파일하기 때문입니다.
상기의 결과로 생성된 main파일은, 터미널 상에서 이하의 커맨드로 실행시킬 수 있습니다.
> ./main
'C++' 카테고리의 다른 글
C++ :: 터미널 커맨드 하나로 컴파일과 실행 동시에 하기 (0) | 2018.01.20 |
---|