본문 바로가기
프로그래밍 언어/C++

[C/C++] Header Guard 활용

by 까망 하르방 2024. 7. 24.
반응형

여러 파일에서 특정 헤더 파일을 #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++] [전처리기] #if

 

[C/C++] [전처리기] #if

#ifif - else문과 비슷한 구조를 가진다.다만 끝에 #endif 닫아주는 지시어가 존재한다.또한 조건문에 사용되는 소괄호와 동작 내용 부분의 중괄호가 존재하지 않는다. #include #define MODE 1#if MODE == 1ch

zoosso.tistory.com

 

 

📌 [C/C++] #ifdef, #if defined() 비교 및 활용

 

[C/C++] #ifdef, #if defined() 비교 및 활용

[전처리기] #ifdef에서 #ifdef 형태와 활용 방법을 다루었다. #define IMSI #ifdef IMSI #define MAX_SPEED 10 #else #define MAX_SPEED 100 #endif int speed; int main() { // 최고 속도이하로 수치조정 if (speed > MAX_SPEED) speed = MAX_S

zoosso.tistory.com

반응형

'프로그래밍 언어 > 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

댓글