2009-06-07 4 views
4

고전적인 '고디안 매듭'상황에 희생 된 .h 파일 집합이있을 때 무엇을합니까? 여기에 #include를 포함하면 .h는 거의 전체를 포함하여 끝남을 의미합니까? 예방은 분명히 최고의 약이지만, 공급 업체 (!)가 라이브러리를 출하하기 전에 이러한 일이 발생했을 때 무엇을합니까?엉클링 .h 의존성

다음은 질문의 확장입니다.이 질문은 아마도 더 적절한 질문 일 것입니다. 첫 번째로 종속성을 해소하려고 시도합니까?;

+0

+1, 나도 비슷한 문제가있다. – Naveen

답변

4

이미 많은 라이브러리로 분할 된 C++ 코드베이스에서이 작업을 수행했습니다 (좋은 시작이었습니다).

나는 어떤 라이브러리가 가장 많이 의존했는지를 연습 (또는 추측)해야했으며, 이는 코드베이스의 다른 부분에 의존하지 않았습니다. 나는 각 라이브러리를 차례로 처리했다.

차례로 각 모듈 (* .cpp 파일)을 살펴본 후 자체 헤더가 #included되고 나머지가 주석 처리되었는지 확인한 다음 해당 헤더 파일의 모든 #include를 주석 처리 한 다음, 컴파일러가 필요한 것을 알려주도록 모듈을 컴파일했다. 필자는 필요할 것으로 보이는 첫 번째 헤더의 주석을 제거하고, 필요에 따라 재귀 적으로 검토했다. 얼마나 많은 헤더가 필요하지 않게되었는지 보는 것은 흥미 롭습니다.

class name; 또는 struct name;을 사용하십시오 (포인터 또는 참조가 있으므로 이름 만 필요함). 이는 순방향 선언이라고하며 헤더 파일을 # 포함하지 않습니다.

컴파일러는 #includes를 주석 처리 할 때 종속성이 무엇인지 알려주는 데 매우 유용합니다 (이식성을 유지해야하는 모든 컴파일러로 다시 컴파일해야 함).

때때로 라이브러리간에 모듈을 이동시켜 라이브러리의 쌍이나 그룹이 서로 종속되지 않도록해야했습니다.

+0

헤더의 정방향 선언에 +1, 구현 파일에 전체 포함. – CiscoIPPhone

1

기회가 있기 때문에 크기가 너무 큰 포함을 줄이기 위해 코드를 리팩터링해야하지만 패키지 결합을 달성 할 수 있다고 가정합니다. 코드의 모든 사용자가 모든 요소를 ​​포함해야한다는 사실을 깨닫게되면 최종 결과는 같습니다.

또 다른 옵션은 #defines를 사용하여 섹션을 설정 및 해제하는 것입니다. 그럼에도 불구하고 기존 코드 기반의 경우 솔루션은 패키지 응집력으로 이동해야합니다.

읽기 : http://ivanov.files.wordpress.com/2007/02/sedpackages.pdf 및 패키지 응집력과 관련된 연구 문제.

1

매듭을 몇 번 풀어 봤는데 가능한 한 많이 의존성을 줄이기 위해 시스템을 유지 보수 할 때 일반적으로 도움이되었습니다. 종속성 트리를 생성하기위한 적절한 도구가 있습니다 (당시 Klocwork를 사용하고있었습니다).

내가 발견 한 단점은 조건부 컴파일로 인한 것입니다. 우리가 필요로하지 않는다고 생각하기 때문에 누군가 헤더 파일을 삭제할 수도 있지만 VxWorks가 필요로하는 Solaris (또는 합리적인 Posix 시스템)에서 VxWorks의 헤더가 엉망이기 때문에 필요하지 않습니다. 그것.

0

거대한 수의 잘 정리 된 머리글과 모든 것을 포함하는 단일 머리글 사이에 균형을 유지해야합니다. 표준 C 라이브러리를 고려하십시오. <stdio.h>과 같이 많은 기능을 선언하는 헤더가 있지만 I/O와 관련이 있습니다. 잡다한 것보다 더 많은 다른 헤더가 있습니다 - 특히 <stdlib.h>.

C에 대한 고다드 우주 비행 센터 지침은 사냥 가치가 있습니다.

기본 규칙은 각 헤더가 적절한 (일반적으로 작은) 소스 파일 세트가 제공하는 기능을 선언해야한다는 것입니다. 시설 및 헤더는 자체 완비되어야합니다. 즉 누군가가 헤더 "something.h"에 코드를 필요로하는 경우 컴파일에 추가해야하는 유일한 헤더 여야합니다. "something.h"에서 필요로하는 시설이 헤더에 선언되지 않은 경우 관련 헤더를 포함해야합니다. 즉, 함수 중 하나가 size_t을 사용하기 때문에 헤더가 <stddef.h>을 포함하여 끝나는 것을 의미 할 수 있습니다.

@quamrana가 지적하는 것처럼, 적절한 경우에는 질문이 태그가 붙어 있기 때문에 (클래스가 아닌 클래스에 대한) 순방향 선언을 사용할 수 있습니다. 이는 주로 인터페이스가 포인터를 취하고 크기를 알 필요가없는 경우를 의미합니다 구조 또는 구성원 중 임의의 것.