자동 복제 헤더 제외의 한 가지 어려움은 파일 이름이 포함 된 대상에 대해 C 표준이 상대적으로 침묵한다는 것입니다. 예를 들어, 컴파일되는 기본 파일에 지시문이 포함되어 #include "f1.h"
있고 #include "f2.h"
해당 지시문에 대해 찾은 파일에 모두 포함되어 있다고 가정하십시오 #include "f3.h"
. 경우 f1.h
와 f2.h
다른 디렉토리에 있지만 검색하여 발견 된 후이 불분명 것, 경로를 포함 #include
하는 파일 내 지시가 같은로드하도록 구성되었다 f3.h
파일 또는 다른 사람을.
상대 경로를 포함한 포함 파일의 가능성을 추가하면 상황이 더욱 악화됩니다. 헤더 파일이 중첩 된 include 지시문에 상대 경로를 사용하고 제공된 헤더 파일을 변경하지 않으려는 경우 프로젝트 디렉토리 구조 내에서 여러 위치에 헤더 파일이 복제되어야 할 수도 있습니다. 해당 헤더 파일의 여러 물리적 사본이 존재하더라도 의미 상 단일 파일 인 것처럼 간주해야합니다.
는 IF #pragma once
지시문을 수행 할 수있는 식별자 허용되는 once
식별자는 이전-발생 하나 일치하는 경우 컴파일러는 파일을 생략해야한다는 의미로, #pragma once
지시어, 그 의미가 명확한 것을; #include
지시어가 #pragma once
이전 파일과 동일한 태그가 지정된 파일을 로드 한다고 말할 수있는 컴파일러 는 파일을 다시 열지 않고 파일을 건너 뛰면 약간의 시간을 절약 할 수 있지만 파일을 건너 뛸지 여부에 따라 이러한 탐지는 의미 론적으로 중요하지 않습니다. 파일 이름이 일치하는 것으로 인식되었습니다. 그러나 나는 그런 식으로 작동하는 컴파일러를 모른다. 컴파일러가 파일이 패턴 #ifndef someIdentifier / #define someIdentifier / #endif [for that ifndef] / nothing following
과 일치하는지 여부를 관찰 하고 위와 같은 #pragma once someIdentifier
경우를 처리합니다.someIdentifier
정의 된 그대로, 본질적으로 좋습니다.
#pragma once
에는 해당 파일을 한 번만 포함하도록 컴파일러에 지시하는 것이 있습니다.