여러 파일에서 특정 헤더 파일을 #include 할 수 있다.
이 경우 헤더파일이 중복 컴파일되어 에러 발생하게 된다.
그렇기에 모든 header 파일은 여러 번 포함되는 것을 방지하기 위해
header guard를 가지고 있어야 한다.
#pragma once
C++ 표준은 아니지만
컴파일러 대부분이 지원하며 컴파일 속도가 빠른 편이다.
또한 이름 충돌 위험도 적은 편이라서 활용도가 좋다.
* 모든 컴파일러에 지원되지 않는다.
#pragma once
class MyClass
{
public:
MyClass();
~MyClass();
void doSomething();
};
• 헤더파일 포함횟수와 관계없이 단 한번만 컴파일 처리
• header 파일 1번째 줄 [#pragma once] 작성
2번째 줄은 공백으로 하고 3번째 줄부터 코드 작성
전처리기
또 다른 방법으로는 전처리기를 활용하는 방법이다.
#ifndef __MYCLASS_H__ // 헤더 가드 시작
#define __MYCLASS_H__ // 헤더 가드 정의
class MyClass {
public:
MyClass();
~MyClass();
void doSomething();
};
#endif // __MYCLASS_H__ // 헤더 가드 끝
정의되지 않은 헤더파일 define을 만들고
그 이후로는 해당 헤더 파일을 재정의 하지 않게 된다.
• #define header guard symbol 이름은 unique 해야 한다.
• 소문자가 아닌 대문자 사용
• __<FILE>_H__ 혹은 __<PATH>_<FILE>_H__ 로 작성하는데
앞뒤로 '_' (or '__')를 사용하고 형태
• #endif 에 한 줄 주석이나 block 주석(/* */) 기술
Q) 어떤 방식이 좋을까?
컴파일러가 지원만 해준다면 #define 이름이 unique 할 필요도 없으며
한줄로 간단하게 구현할 수 있는 #pragma once 권장
Q) [A.cpp]에서 [B.h] 파일을 포함해야 하는 경우는 어떤 것이 좋을까?
가정 ) [A.cpp]는 [A.h]파일을 포함 하고 있음
case 1) [A.h]에서 include B.h
case 2) [A.cpp]에서 include B.h
A) 연쇄적인(간접적인) 포함을 피하는 것이 좋다.
즉 [A.cpp]에서 [B.h] 파일을 포함해야 한다.
이는 [A.h]에서 [B.h] 파일을 포함하더라도 연쇄적인 형태를 피하는 것이 좋다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] auto 키워드 (4) | 2024.10.28 |
---|---|
[C/C++] union 공용체 (2) | 2024.10.27 |
[C++] 생성자 함수 (2) | 2024.06.03 |
[C++] constexpr 키워드 (2) | 2024.04.01 |
[C++] explicit 키워드 (0) | 2023.01.20 |
댓글