본문 바로가기

C, C++

#pragma once

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