2012-05-05 10 views
4

여러분 모두가 헤더의 순환 종속성을 알고 있다고 가정합니다. 그것의 결과는 일반적으로 다음과 같다 :C++ 헤더의 순환 종속성. 찾는 방법?

오류 : 'MyClass에'는이 범위

에 선언되지 않은 프로그램이이해야 할 분명한 짧은 경우. 하지만 프로그램에 수십 개의 파일이있는 경우 ...

내 질문은 "알고리즘 순환 의존 관계를 찾으려면 무엇입니까?" "성공할 때까지 코드를 살펴 보는 것"이 ​​아니라 어떤 특정 단계를 의미합니다.

어떤 프로그램 일 수 있습니까?

+0

관련이 있지만 실제로는 중복되지 않습니다 : http://stackoverflow.com/questions/614794/c-c-detecting-superfluous-includes 일반적으로 컴파일하지 않는 프로그램에 정적 분석을 수행하는 것은 어렵습니다. 하지만 거대한 코드 기반에서도 순환 종속성을 찾기가 어렵다는 것을 알지 못했습니다. – pmr

+0

내 솔루션은 헤더에 다른 파일을 포함시키지 않고 구현 .cpp 파일에 항상 필요한 헤더를 포함시키는 것입니다. 일반적으로 나는 (VS 함께) 모든 일반적인 것들에 대한 미리 컴파일 된 헤더를 누른 다음 내가 일하고있는 특정 프로젝트에 대한 모든 것들에 대한 또 다른 헤더가 있습니다. – Robinson

답변

0

문서 도구 Doxygen은 종속성을 나타내는 다이어그램을 생성 할 수 있습니다. 다른 라이브러리의 헤더 파일 사이에 순환 종속성을 표시하는 데 사용했습니다.

-1

But if the program has tens of files...

그렇다면 여전히 짧습니다. 컴파일러 오류 메시지에 언급 된 행으로 이동하여 클래스가 여기에 있는지 확인하십시오. * .cpp에 문제가 발생하면 해당 파일을 #include하십시오. 헤더에 문제가 발생하면 앞으로 선언 (class MyClass;)을 추가하십시오. forward 선언이 충분하지 않은 경우 # myclass를 선언하는 파일을 #include하십시오. 이로 인해 순환 종속성이 발생하면 헤더 당 유형이 너무 많습니다. 머리글을 여러 개의 작은 머리글로 나눕니다. 이를 수행하는 한 가지 방법은 전체 프로그램에 대해 헤더 당 하나의 클래스를 갖는 것입니다. 그러나 많은 시나리오에서 이는 과도 할 수 있습니다.

0

적어도 하나의 컴파일러 (Visual C++)에는 포함 순서를 추적하는 데 도움이되는 "표시 포함"이라는 옵션이 있습니다. 그러면주기가 어디에서 발생하는지 알 수 있습니다. 컴파일러에 이러한 옵션이없는 경우 파일 시작 부분에 #pragma message (또는 이와 동등한 파일)를 추가하여 추적 할 수 있습니다.