일반적으로 헤더파일의 중복 포함을 방지하기 위한 방법으로
1. #pragma once 와 2. include Guard 의 2가지 방법을 사용하며 큰 결과물(헤더가 중복 컴파일 되지 않음)은 동일하다.
하지만 세부적으로 구현 및 동작에 차이가 있고 각 상황마다 권장되는 방식이 다르기 때문에 차이점을 알고 구분해서 사용하는것이 좋다.
1. #pragma once
- Header 파일 최상단에 위치함.( Include 선언 전에)
- Visual Studio 에서 자체 생성되는 Class 의 헤더 파일에 자동으로 추가되는 형태.
#pragma once
// 헤더 파일 내용
class CustomClass {
// 클래스 정의
};
- 코드의 간결함: 한 줄로 중복 포함 방지를 설정해서 코드가 간결해짐.
- 빠른 컴파일: 대부분의 컴파일러에서 #pragma once는 빠른 파일 포함 검사를 수행할 수 있어 컴파일 시간이 단축
- 중복 방지동작의 편리함: 동일한 파일을 여러 경로로 포함하더라도 이를 자동으로 감지하여 중복 방지 함.
- 구버전과의 이식성 이슈: 구버전 컴파일러를 사용할 경우 인식되지 않을 수 있음.
2. Include Guard
#ifndef CUSTOMCLASS_H
#define CUSTOMCLASS_H
// 헤더 파일 내용
class CustomClass {
// 클래스 정의
};
#endif //CUSTOMCLASS_H
- 이식성 높음: 모든 표준 C/C++ 컴파일러에서 지원. 상대적으로 #pragma once는 표준이 아니므로 일부 오래된 컴파일러에서 미지원 되는 가능성도 있다.
- 코드적 명시적: 파일이 어디에서 시작되고 끝나는지 명확하게 확인 가능.
- 높은 코드 복잡성: #pragma once 에 비해 비교적 코드가 길어지며, 고유한 매크로 이름을 사용해야함.
만약 동일한 이름의 매크로가 다른 헤더 파일에서 사용될 경우 충돌할 수 있음.
3. 결론
- Include Guard 의 경우는 코드 이식성이 중요한경우
-예를 들어 어떤 컴파일러에도 대응해야 하는 오픈소스와 같은 경우-
에 사용
- 그외의 모든 경우는#pragma once 를 사용 하는게 더 좋다.