티스토리 툴바


Include guard

일/Programming 2012/03/28 09:31

//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. 습관화를 통해 삽질을 줄이자.

저작자 표시

◀ PREV : [1] : [2] : [3] : [4] : [5] : ... [16] : NEXT ▶