[C++] 헤더파일 중복방지 #Pragma once vs #ifndef ~ endif

2025. 6. 10. 20:43·C++

1. 헤더파일의 역할

헤더파일은 함수, 매크로, 구조체, 클래스 등의 정의를 담고 있는 파일이다

다른 소스파일에서 헤더파일을 include하여 해당 코드를 재사용하거나 모듈화할 수 있다

헤더파일은 일반적으로 .h 확장자를 가지며, 함수의 정의가 아닌 선언만 포함한다

2. 헤더파일 중복의 문제점

헤더파일을 여러 소스파일에서 중복해서 include하는 경우, 동일한 내용이 중복으로 정의될 수 있다
이로 인해 컴파일러는 같은 클래스, 함수 등을 중복 정의하는 것으로 인식하게 된다
이는 컴파일 시간이 증가하고 메모리 사용량이 증가하는 원인이 되고, 코드의 가독성과 유지보수성이 저하될 수 있다

3. 헤더파일 중복방지 지시자

이를 방지하기 위해 C++에는 두가지 지시자가 있는데, #Pragma once와 #ifndef ~endif이다

#ifndef 구문은 조건문을 통해 실행여부를 판단하고, #pragma once 구문은 '이 파일을 한번만 읽어들여라' 라는 뜻이다

두 지시자의 차이를 확인해보자

4-1. #ifndef ~ endif

//Header1.h
#ifndef HEADER1_H
#define HEADER1_H

#include <iostream>

class Header1() {
	//구현 생략
};

#endif // HEADER1_H

여러 예제를 참고했을 때 _가 각각 다르게 작성되는데 (HEADER1_H, HEADER1_H_, _HEADER1_H_)

어떤 식으로 써도 상관없다. 다만 ifndef와 define에는 똑같이 작성하도록 하자

//Header2.h
#ifndef HEADER2_H
#define HEADER2_H

#include "Header1.h"

class Header2() {
	//구현 생략
};

#endif // HEADER2_H
//main.cpp
#include <iostream>
#include "Header1.h"
#include "Header2.h"

int main() {
    Header1 h1;
    Header2 h2;
    return 0;
}

위와 같이 main.cpp에서 두 헤더파일을 include 할 때, Header1.h 파일이 중복 include 되는 것을 확인할 수 있다.

4-2. #Pragma once

//header1.h
#pragma once

class Header1() {
    //구현 생략
};

pragma once는 헤더파일의 포함횟수에 관계없이 단 한번만 처리를 하고 같은 파일의 경우 파일을 읽기 조차 하지않는다

 

5. 정리

  안정성, 범용성 컴파일 속도
#pragma once 지양 빠름
#ifndef ~ #endif 권장 느림

 

#pragma once의 경우 컴파일 동안 오직 한번만 포함되도록 하므로 #pragma once가 명시되면 컴파일러가 파일 열기 자체를 시도하지 않아 컴파일 속도가 빨라진다.

하지만 #pragma once는 일부 구형 컴파일러에서 지원하지 않아 안정성과 범용성에 있어서 #ifndef ~ endif보다는 떨어진다

 

결론은 구형 컴파일러에서 동작한다면 #ifndef ~ endif를, 그 외에 경우에는 #pragma once를 사용하도록 한다

'C++' 카테고리의 다른 글

[C++] System() 함수 - "cls" , "pause"  (0) 2025.06.13
[C++] 얕은 복사 vs 깊은 복사  (1) 2025.06.12
[C++] 스마트 포인터(Smart Pointer) 개념 정리  (0) 2025.06.12
[C++] 깔끔한 코드 작성법 - 헤더파일과 소스파일을 나누는 이유  (0) 2025.06.05
[C++] String 클래스 정리 및 함수 사용  (0) 2025.06.04
'C++' 카테고리의 다른 글
  • [C++] 얕은 복사 vs 깊은 복사
  • [C++] 스마트 포인터(Smart Pointer) 개념 정리
  • [C++] 깔끔한 코드 작성법 - 헤더파일과 소스파일을 나누는 이유
  • [C++] String 클래스 정리 및 함수 사용
_Bin_
_Bin_
  • _Bin_
    빈코드 (이전중)
    _Bin_
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 전체보기 (75)
      • C++ (8)
      • Unreal Engine (11)
      • Algorithm (6)
      • 컴퓨터지식(CS) (3)
      • 코딩테스트 (45)
      • 팀프로젝트 (1)
      • 기술면접 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    struct
    Algorithm
    프로그래머스
    Red-Black Tree
    CS
    내일배움캠프
    class
    AVL Tree
    SOLID원칙
    프로그래밍
    코딩테스트
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
_Bin_
[C++] 헤더파일 중복방지 #Pragma once vs #ifndef ~ endif
글쓰기상단으로

티스토리툴바