이것은 "표준"종류의 코딩 표준이 아닌 "해야한다"중 하나입니다. 그 이유는 C ++ 파서를 작성하여 강제로 작성해야하기 때문입니다.
헤더 파일의 가장 일반적인 규칙은 헤더 파일이 스스로 대기해야한다는 것입니다. 헤더 파일은 해당 헤더를 포함하기 전에 다른 헤더 파일을 #include하는 것을 요구하지 않아야합니다. 이것은 테스트 가능한 요구 사항입니다. 임의의 헤더가 주어지면 foo.hh
다음을 컴파일하고 실행해야합니다.
#include "foo.hh"
int main () {
return 0;
}
이 규칙은 일부 헤더에서 다른 클래스의 사용과 관련하여 결과가 있습니다. 때로는 다른 클래스를 선언하여 이러한 결과를 피할 수 있습니다. 많은 표준 라이브러리 클래스에서는 불가능합니다. std::string
또는 과 같은 템플릿 인스턴스화를 전달할 방법이 없습니다 std::vector<SomeType>
. 당신에있는 #include
유형의 유일한 사용하는 함수에 인수로 경우에도 헤더에 그 STL 헤더.
또 다른 문제는 실수로 끌어서 놓는 것들입니다. 예 : 다음을 고려하십시오.
foo.cc 파일 :
#include "foo.hh"
#include "bar.hh"
void Foo::Foo () : bar() { /* body elided */ }
void Foo::do_something (int item) {
...
bar.add_item (item);
...
}
다음 bar
은 Foo
유형 의 클래스 데이터 멤버입니다 Bar
. 여기에서 옳은 일을했고 class를 정의하는 헤더에 포함되어 있어야하지만 #included bar.hh가 있습니다 Foo
. 그러나 Bar::Bar()
및에 사용 된 내용은 포함하지 않았습니다 Bar::add_item(int)
. 이러한 호출로 인해 추가 외부 참조가 발생할 수있는 경우가 많습니다.
foo.o
와 같은 도구 를 사용 하여 분석 nm
하면 해당 함수 foo.cc
가 적절하지 않은 모든 종류의 항목을 호출 하는 것처럼 보입니다 #include
. 따라서 #include
부수적 외부 참조에 대한 지시문을 추가해야 foo.cc
합니까? 대답은 절대 아닙니다. 문제는 부수적으로 호출되는 기능과 직접 호출되는 기능을 구별하기가 매우 어렵다는 것입니다.