//test.h
class TestBase {
private:
int mNum;
public:
TestClass(int i) : mNum(i) {
}
int GetNum() {
return mNum;
}
void SetNum(int i) {
mNum = i;
}
}
//test1.h
#include "test.h"
class Test : TestBase {
public:
Test(int i) : TestBase(i) {
}
}
//main.cpp
#include "test.h"
#include "test1.h"
int main(void) {
TestBase tb(100);
Test t(500);
return 0;
}
위와 같은 코드를 빌드 하게 되면 TestBase 클래스 재정의 에러가 발생함.
- main.cpp에서 test.h를 포함하고 다음줄에 test1.h를 포함함으로써 TestBase가 중복 정의 되었기 때문
위의 경우 main.cpp에서 test.h를 포함시키지 않거나, 무식한 방법으로 헤더를 한군데 작성한다던가 하는 방식으로 해결할 수 가 있지만 이는 바람직한 방법이 될 수 없다. 따라서 헤더파일들의 시작과 끝에 아래와 같은 코드를 작성함으로써 컴파일에러를 방지할 수 있다.
#ifndef TEST_H #define TEST_H ..... ..... #endif위 코드를 해석해 보면 "TEST_H가 정의 되어 있지 않으면 TEST_H를 정의하라"인데, TEST_H가 정의되고 추후 같은 헤더 파일을 포함하게 될때는 TEST_H가 정의 되어 있기 때문에 스킵하고 컴파일하게 된다. 이로서 문제를 해결할 수 있다. ("_TEST_H" 라고 이름짓지 않는 이유는 _로 시작하는 이름은 컴파일러에서 사용하는것이기 때문에 충돌 가능성을 줄이고자)
혹은 아래 한줄로 위 내용을 적용할 수 있다.
#pragma once
위 코드를 헤더 파일 가장 위에 정의하는것. 이는 컴파일러에게 "이 헤더파일은 한번만 포함해서 컴파일 하거라" 하고 알려주는 역할을 한다. GCC와 VC++에서 정상동작, 다른 컴파일러는 모르겠심.
ps. 습관화를 통해 삽질을 줄이자.