include guard
•
기존에는 아래처럼 헤더 중복을 방지했습니다.
#ifndef HEADER_H
#define HEADER_H
// 내용
#endif
C++
복사
•
위 내용은 HEADER_H라는 매크로가 정의되어 있지 않다면, HEADER_H 매크로를 정의한다는 내용입니다.
•
즉, 해당 헤더 파일을 처음 include할 때만 HEADER_H 매크로가 정의되어 있지 않으므로, HEADER_H 매크로를 정의하고 아래 헤더 파일 내용들도 같이 적용될 것입니다.
•
만약 또 다시 해당 헤더 파일을 include 했다면, 이미 HEADER_H 매크로가 정의되어 있으므로, #ifndef HEADER_H가 false가되어 #endif까지 넘어가게 됩니다.
•
이런 방식의 include guard는 예전부터 쓰이던 방법이고 모든 컴파일러에서 동작합니다.
#pragma once (추천)
•
#pragma once 도 include guard와 동일한 역할로 사용됩니다.
#pragma once
// 내용
C++
복사
•
단 한줄로 사용이 가능하며, 헤더 파일의 이름을 사용하여 define할 필요도 없고, 때때로 컴파일 속도도 향상시킵니다.
•
하지만 #pragma once는 표준이 아니고, 지원하지 않는 컴파일러도 존재합니다.
같이쓰자
•
#pragma once의 효율성 및 include guard의 호환성을 살리기 위해 같이 쓰이기도 합니다.
#pragma once
#ifndef HEADER_H
#define HEADER_H
// 내용
#endif
C++
복사