고전적인 '고디안 매듭'상황에 희생 된 .h 파일 집합이있을 때 무엇을합니까? 여기에 #include를 포함하면 .h는 거의 전체를 포함하여 끝남을 의미합니까? 예방은 분명히 최고의 약이지만, 공급 업체 (!)가 라이브러리를 출하하기 전에 이러한 일이 발생했을 때 무엇을합니까?엉클링 .h 의존성
다음은 질문의 확장입니다.이 질문은 아마도 더 적절한 질문 일 것입니다. 첫 번째로 종속성을 해소하려고 시도합니까?;
고전적인 '고디안 매듭'상황에 희생 된 .h 파일 집합이있을 때 무엇을합니까? 여기에 #include를 포함하면 .h는 거의 전체를 포함하여 끝남을 의미합니까? 예방은 분명히 최고의 약이지만, 공급 업체 (!)가 라이브러리를 출하하기 전에 이러한 일이 발생했을 때 무엇을합니까?엉클링 .h 의존성
다음은 질문의 확장입니다.이 질문은 아마도 더 적절한 질문 일 것입니다. 첫 번째로 종속성을 해소하려고 시도합니까?;
이미 많은 라이브러리로 분할 된 C++ 코드베이스에서이 작업을 수행했습니다 (좋은 시작이었습니다).
나는 어떤 라이브러리가 가장 많이 의존했는지를 연습 (또는 추측)해야했으며, 이는 코드베이스의 다른 부분에 의존하지 않았습니다. 나는 각 라이브러리를 차례로 처리했다.
차례로 각 모듈 (* .cpp 파일)을 살펴본 후 자체 헤더가 #included되고 나머지가 주석 처리되었는지 확인한 다음 해당 헤더 파일의 모든 #include를 주석 처리 한 다음, 컴파일러가 필요한 것을 알려주도록 모듈을 컴파일했다. 필자는 필요할 것으로 보이는 첫 번째 헤더의 주석을 제거하고, 필요에 따라 재귀 적으로 검토했다. 얼마나 많은 헤더가 필요하지 않게되었는지 보는 것은 흥미 롭습니다.
class name;
또는 struct name;
을 사용하십시오 (포인터 또는 참조가 있으므로 이름 만 필요함). 이는 순방향 선언이라고하며 헤더 파일을 # 포함하지 않습니다.
컴파일러는 #includes를 주석 처리 할 때 종속성이 무엇인지 알려주는 데 매우 유용합니다 (이식성을 유지해야하는 모든 컴파일러로 다시 컴파일해야 함).
때때로 라이브러리간에 모듈을 이동시켜 라이브러리의 쌍이나 그룹이 서로 종속되지 않도록해야했습니다.
헤더의 정방향 선언에 +1, 구현 파일에 전체 포함. – CiscoIPPhone
기회가 있기 때문에 크기가 너무 큰 포함을 줄이기 위해 코드를 리팩터링해야하지만 패키지 결합을 달성 할 수 있다고 가정합니다. 코드의 모든 사용자가 모든 요소를 포함해야한다는 사실을 깨닫게되면 최종 결과는 같습니다.
또 다른 옵션은 #defines를 사용하여 섹션을 설정 및 해제하는 것입니다. 그럼에도 불구하고 기존 코드 기반의 경우 솔루션은 패키지 응집력으로 이동해야합니다.
읽기 : http://ivanov.files.wordpress.com/2007/02/sedpackages.pdf 및 패키지 응집력과 관련된 연구 문제.
매듭을 몇 번 풀어 봤는데 가능한 한 많이 의존성을 줄이기 위해 시스템을 유지 보수 할 때 일반적으로 도움이되었습니다. 종속성 트리를 생성하기위한 적절한 도구가 있습니다 (당시 Klocwork를 사용하고있었습니다).
내가 발견 한 단점은 조건부 컴파일로 인한 것입니다. 우리가 필요로하지 않는다고 생각하기 때문에 누군가 헤더 파일을 삭제할 수도 있지만 VxWorks가 필요로하는 Solaris (또는 합리적인 Posix 시스템)에서 VxWorks의 헤더가 엉망이기 때문에 필요하지 않습니다. 그것.
거대한 수의 잘 정리 된 머리글과 모든 것을 포함하는 단일 머리글 사이에 균형을 유지해야합니다. 표준 C 라이브러리를 고려하십시오. <stdio.h>
과 같이 많은 기능을 선언하는 헤더가 있지만 I/O와 관련이 있습니다. 잡다한 것보다 더 많은 다른 헤더가 있습니다 - 특히 <stdlib.h>
.
C에 대한 고다드 우주 비행 센터 지침은 사냥 가치가 있습니다.
기본 규칙은 각 헤더가 적절한 (일반적으로 작은) 소스 파일 세트가 제공하는 기능을 선언해야한다는 것입니다. 시설 및 헤더는 자체 완비되어야합니다. 즉 누군가가 헤더 "something.h"
에 코드를 필요로하는 경우 컴파일에 추가해야하는 유일한 헤더 여야합니다. "something.h"
에서 필요로하는 시설이 헤더에 선언되지 않은 경우 관련 헤더를 포함해야합니다. 즉, 함수 중 하나가 size_t
을 사용하기 때문에 헤더가 <stddef.h>
을 포함하여 끝나는 것을 의미 할 수 있습니다.
@quamrana가 지적하는 것처럼, 적절한 경우에는 질문이 태그가 붙어 있기 때문에 (클래스가 아닌 클래스에 대한) 순방향 선언을 사용할 수 있습니다. 이는 주로 인터페이스가 포인터를 취하고 크기를 알 필요가없는 경우를 의미합니다 구조 또는 구성원 중 임의의 것.
+1, 나도 비슷한 문제가있다. – Naveen