once
pragma
소스 코드 파일을 컴파일할 때 컴파일러에 헤더 파일이 한 번만 포함되도록 지정합니다.
구문
#pragma once
설명
컴파일러가 번역 단위의 #pragma once
첫 번째 #include
파일 이후에 파일을 다시 열고 읽지 않으므로 빌드 시간을 줄일 수 있습니다. 이를 다중 포함 최적화라고 합니다. 전처리기 매크로 정의를 사용하여 파일 내용이 여러 대 포함되지 않도록 하는 include 가드 관용구와 유사한 효과가 있습니다. 또한 모든 템플릿, 형식, 함수 및 개체에 코드에 둘 이상의 정의가 있어야 한다는 하나의 정의 규칙 위반을 방지하는 데 도움이 됩니다.
예시:
// header.h
#pragma once
// Code placed here is included only once per translation unit
#pragma once
지시문은 전처리기 기호를 사용하여 전역 네임스페이스가 잘못되는 것을 방지하기 때문에 새 코드에 사용하는 것이 좋습니다. 입력이 덜 필요하고, 덜 산만하며, 기호 충돌을 일으킬 수 없습니다. 기호 충돌은 다른 헤더 파일이 가드 값과 동일한 전처리기 기호를 사용할 때 발생하는 오류입니다. C++ 표준의 일부는 아니지만 여러 공통 컴파일러에서 이식적으로 구현됩니다.
include 가드 관용구와 #pragma once
동일한 파일을 모두 사용할 경우 이점이 없습니다. 컴파일러는 include 가드 관용구를 인식하고 주석이 아닌 코드 또는 전처리기 지시문이 관용구의 표준 형식 앞이나 다음에 오는 경우 지시문과 동일한 방식으로 #pragma once
다중 포함 최적화를 구현합니다.
// header.h
// Demonstration of the #include guard idiom.
// Note that the defined symbol can be arbitrary.
#ifndef HEADER_H_ // equivalently, #if !defined HEADER_H_
#define HEADER_H_
// Code placed here is included only once per translation unit
#endif // HEADER_H_
지시문을 구현 #pragma once
하지 않는 컴파일러에 코드를 이식해야 하거나, 기존 코드와의 일관성을 유지하거나, 다중 포함 최적화가 불가능한 경우 include 가드 관용구를 사용하는 것이 좋습니다. 파일 시스템 별칭 또는 별칭이 지정된 include 경로가 컴파일러가 정식 경로로 동일한 포함 파일을 식별하지 못하게 하는 경우 복잡한 프로젝트에서 발생할 수 있습니다.
전처리기 기호를 사용하여 효과를 제어하는 헤더 파일에서 여러 번 포함되도록 디자인된 가드 관용구를 사용하지 #pragma once
않도록 주의하세요. 이 디자인의 예제는 assert.h> 헤더 파일을 참조<하세요. 또한 포함 파일에 대한 여러 경로를 만들지 않도록 포함 경로를 관리해야 합니다. 이 경우 포함 가드 및 #pragma once
포함 가드 둘 다에 대한 다중 포함 최적화를 무산할 수 있습니다.