test1.h
struct Test1 {
int a;
int b;
};
test2.h
#include "test1.h"
struct Test2 {
Test1 a;
};
test3.h
#include "test1.h"
struct Test3 {
Test1 a;
char b;
};
test.cpp
#include "test2.h"
#include "test3.h"
이때, test2.h와 test3.h는 공통적으로 test1.h를 포함하고 있는데
test.cpp에서 test2.h와 test3.h를 포함하는 바람에 test1.h이 2개 포함돼 버려 헤더 중복이 됩니다.
즉, Test1가 두 번 정의되어 오류가 납니다.
문제를 해결하기 위해서 test1.h 코드를 다음과 같이 바꿉니다.
#ifndef TEST1_H
#define TEST1_H
struct Test1 {
int a;
int b;
};
#endif
이렇게 컴파일 하면 test2.h의 test1.h를 참조할 때 #ifndef TEST1_H 조건이 맞으므로 #define TEST1_H 하고 밑의 코드를 실행합니다. 그리고 test3.h의 test1.h를 참조할 때 TEST1_H가 이미 정의돼 있으므로 밑의 모든 코드를 무시합니다. 이로써 헤더 중복 문제가 해결되었습니다.
위의 코드를 좀 더 간편하게 하기 위해서 대신 #pragma once를 추가하면 위의 코드와 완전히 같게 동작합니다.
#pragma once
struct Test1 {
int a;
int b;
};
'C, C++' 카테고리의 다른 글
열거형 (0) | 2019.12.21 |
---|---|
#pragma warning (2) | 2019.12.20 |
미리 정의된 매크로 (0) | 2019.12.19 |
#error (0) | 2019.12.17 |
#undef (0) | 2019.12.16 |