새소식

DEV/C++

헤더 중복 방지 #pragma once 와 Include Guard 차이

  • -
728x90

 

일반적으로 헤더파일의 중복 포함을 방지하기 위한 방법으로

1. #pragma once 와 2. include Guard 의 2가지 방법을 사용하며 큰 결과물(헤더가 중복 컴파일 되지 않음)은 동일하다.

 

하지만 세부적으로 구현 및 동작에 차이가 있고 각 상황마다 권장되는 방식이 다르기 때문에 차이점을 알고 구분해서 사용하는것이 좋다.

1. #pragma once

  •  구현
  •  Header 파일 최상단에 위치함.( Include 선언 전에)
  •  Visual Studio 에서 자체 생성되는 Class 의 헤더 파일에 자동으로 추가되는 형태.  
#pragma once

// 헤더 파일 내용
class CustomClass {
    // 클래스 정의
};
  •  특장점 
  1. 코드의 간결함: 한 줄로 중복 포함 방지를 설정해서 코드가 간결해짐.
  2. 빠른 컴파일: 대부분의 컴파일러에서 #pragma once는 빠른 파일 포함 검사를 수행할 수 있어 컴파일 시간이 단축
  3. 중복 방지동작의 편리함: 동일한 파일을 여러 경로로 포함하더라도 이를 자동으로 감지하여 중복 방지 함.
  4. 구버전과의 이식성 이슈: 구버전 컴파일러를 사용할 경우 인식되지 않을 수 있음.

 

2. Include Guard

  • 구현
  • 매크로를 사용하여 중복 포함 방지 
#ifndef CUSTOMCLASS_H
#define CUSTOMCLASS_H

// 헤더 파일 내용
class CustomClass {
    // 클래스 정의
};

#endif //CUSTOMCLASS_H

 

  • 특장점
  1. 이식성 높음: 모든 표준 C/C++ 컴파일러에서 지원. 상대적으로 #pragma once는 표준이 아니므로 일부 오래된 컴파일러에서 미지원 되는 가능성도 있다.
  2. 코드적 명시적: 파일이 어디에서 시작되고 끝나는지 명확하게 확인 가능.
  3. 높은 코드 복잡성: #pragma once 에 비해 비교적 코드가 길어지며, 고유한 매크로 이름을 사용해야함.
    만약 동일한 이름의 매크로가 다른 헤더 파일에서 사용될 경우 충돌할 수 있음.

3. 결론

  • Include Guard 의 경우는 코드 이식성이 중요한경우
    -예를 들어 어떤 컴파일러에도 대응해야 하는 오픈소스와 같은 경우-
    에 사용
  • 그외의 모든 경우는#pragma once 를 사용 하는게 더 좋다.
728x90
Contents

Copied the posting URL.

Please sympathize with me if this article was helpful.