문제

나는 종종 파일의 헤더 섹션이 항상 점점 커지고 더 커지지 만 결코 작아지지 않는다는 것을 알게됩니다. 소스 파일 클래스의 수명 내내 움직여 리팩토링되었을 수 있으며 꽤 많은 것이 가능할 수 있습니다. #includes 그것은 더 이상 거기에있을 필요가 없습니다. 그것들을 거기에두면 컴파일 시간을 연장하고 불필요한 컴파일 종속성을 추가합니다. 여전히 필요한 것을 알아 내려고하는 것은 상당히 지루할 수 있습니다.

불필요한 #include 지시문을 감지하고 안전하게 제거 할 수있는 도구가 있습니까?
Lint는 아마도 이것을합니까?

도움이 되었습니까?

해결책

자동은 아니지만 독사 종속성 다이어그램을 생성합니다 #included 파일. 당신은 시각적으로 그들을 통과해야하지만, 무엇을 사용하는지에 대한 사진을 얻는 데 매우 유용 할 수 있습니다.

다른 팁

Google의 CPPCLEAN (링크에 대한 링크 : 다운로드, 선적 서류 비치) C ++ 문제의 여러 범주를 찾을 수 있으며 이제 불필요한 #includes를 찾을 수 있습니다.

Clang 기반 도구도 있습니다. 이용 한 내용을 포함합니다, 그것은 이것을 할 수 있습니다. 포함하는 것은 전진 선언을 제안 할 수 있으며 (#include 할 필요는 없음) 선택적으로 #includs를 정리할 수 있습니다.

현재 버전 일식 CDT 또한이 기능을 구축하고 소스 메뉴 아래로 이동하고 조직 포함 포함 포함 #incland . 그러나이 기능은 100% 신뢰할 수 없습니다.

또한 체크 아웃하십시오 이용 한 내용을 포함합니다, 비슷한 문제를 해결합니다.

불필요한 포함을 감지하는 문제는 유형 종속성 검사기 일 수 없다는 것입니다. 불필요한 포함은 컴파일에 가치가없는 파일입니다. 그리고 다른 파일이 의존하는 다른 항목을 변경하지 않습니다. 헤더 파일이 상수, 재정의 및/또는 중고 매크로를 정의하여 컴파일을 변경할 수있는 방법에는 여러 가지가 있습니다. 네임 스페이스와 같은 항목을 감지하려면 전처리기보다 훨씬 더 필요한 것이 필요합니다. 실제로 전체 컴파일러가 필요합니다.

Lint는 스타일 체커에 가깝고 확실히이 전체 기능을 갖지 못할 것입니다.

불필요한 포함을 감지하는 유일한 방법은 스위트를 제거, 컴파일 및 달리는 것입니다.

나는 그렇게 생각했다 pclint 이것을 할 것이지만, 내가 그것을 본 지 몇 년이 지났습니다. 당신은 그것을 확인할 수 있습니다.

나는 보았다 이 블로그 그리고 저자는 사용하지 않은 포함을 찾도록 PCLINT를 구성하는 것에 대해 조금 이야기했습니다. 볼만한 가치가있을 수 있습니다.

그만큼 CSCOUT 리팩토링 브라우저는 C (불행히도 C ++가 아님) 코드의 지시문을 불필요하게 포함 할 수 있습니다. 작동 방식에 대한 설명을 찾을 수 있습니다. 이것 저널 기사.

단일 #include 지시문을 지우고 프로젝트를 컴파일하며 #include 및 컴파일 오류가 발생하지 않은 경우 제거 된 파일에 이름을 기록하는 빠른 스크립트를 작성할 수 있습니다.

밤에 실행하자, 다음날 제거 할 수있는 파일의 100% 올바른 목록이 있습니다.

때때로 무차별 대기는 단지 작동합니다 :-)


편집하다: 그리고 때때로 그것은 :-). 다음은 의견의 약간의 정보입니다.

  1. 때로는 두 개의 헤더 파일을 별도로 제거 할 수 있지만 둘 다 함께 제거 할 수는 없습니다. 해결책은 실행 중에 헤더 파일을 제거하고 다시 가져 오지 않는 것입니다. 이 알고리즘을 찾을 수없는 더 많은 파일이있는 솔루션이있을 수 있지만 안전하게 제거 할 수있는 파일 목록이 있습니다. (제거 할 파일 포함 파일의 공간에 대한 탐욕스러운 검색입니다. 로컬 최대 값 만 찾을 수 있습니다)
  2. 일부 #ifdef에 따라 일부 매크로가 다르게 재정의 된 경우 행동에 미묘한 변화가있을 수 있습니다. 나는 이것들이 매우 드문 경우라고 생각하며, 빌드의 일부인 단위 테스트는 이러한 변화를 포착해야합니다.

미안합니다 (다시) 여기에 게시하면 사람들은 종종 의견을 확장하지 않습니다.

Crashmstr에 대한 내 의견을 확인하십시오. Flexelint / PC-Lint 가이 작업을 수행합니다. 정보 메시지 766. 내 매뉴얼 (버전 8.0)의 11.8.1 항이이를 논의합니다.

또한, 그리고 이것은 중요합니다. 메시지가 사라질 때까지 계속 반복하십시오.. 다시 말해, 미사용 헤더를 제거한 후 보풀을 다시 실행하면 더 많은 헤더 파일이 불필요한 헤더를 제거하면 "불필요"가되었을 수 있습니다. (어리석게 들릴 수도 있고 천천히 읽고 구문 분석하십시오. 의미가 있습니다.)

나는 당신이 요구하는 것을 달성하는 본격적인 도구를 찾지 못했습니다. 내가 사용한 가장 가까운 것은입니다 IncludEmanager, 헤더 포함 트리를 그래프로 표시하여 하나의 파일에만 포함 된 헤더와 원형 헤더 포함을 시각적으로 발견 할 수 있습니다.

Eclipse CDT를 사용하는 경우 시도해 볼 수 있습니다 http://includator.com 베타 테스터 (이 글을 쓰는 시점)에게는 무료이며 자동으로 불필요한 #includes 또는 누락 된 것을 추가합니다. Flexelint 또는 PC-Lint가 있고 Elicpse CDT를 사용하는 사용자를 위해 http://linticator.com 옵션 일 수 있습니다 (베타 테스트 무료). Lint의 분석을 사용하지만 불필요 #include 문을 자동으로 제거하기위한 빠른 고정을 제공합니다.

Flexelint (PC-Lint의 UNIX 버전)를 사용해 보았고 다소 혼합 된 결과를 얻었습니다. 이것은 매우 크고 매듭이 많은 코드 기반을 연구하고 있기 때문일 것입니다. 사용하지 않는 것으로보고 된 각 파일을 신중하게 검사하는 것이 좋습니다.

주요 걱정은 잘못된 긍정입니다. 동일한 헤더의 다중 포함은 불필요한 헤더로보고됩니다. Flexelint는 헤더가 포함 된 선 또는 이전에 포함 된 위치를 알려주지 않기 때문에 이것은 나쁩니다.

자동화 된 도구가 잘못 될 수있는 방법 중 하나입니다.

A.HPP에서 :

class A { 
  // ...
};

B.hpp에서 :

#include "A.hpp

class B {
    public:
        A foo;
};

C.CPP에서 :

#include "C.hpp"  

#include "B.hpp"  // <-- Unneeded, but lint reports it as needed
#include "A.hpp"  // <-- Needed, but lint reports it as unneeded

Flexelint의 메시지를 맹목적으로 따르면 #include 종속성을 멍청하게 만들 것입니다. 더 많은 병리학 적 사례가 있지만 기본적으로 최상의 결과를 얻으려면 헤더를 직접 검사해야합니다.

이 기사를 강력히 추천합니다 물리적 구조 및 C ++ 내부의 블로그 게임에서. 그들은 #include 엉망을 청소하는 포괄적 인 접근법을 권장합니다.

가이드 라인

다음은 파일 간의 물리적 종속성 수를 최소화하는 Lakos의 책의 증류 된 지침 세트입니다. 나는 몇 년 동안 그것들을 사용해 왔으며 항상 결과에 정말 만족했습니다.

  1. 모든 CPP 파일에는 먼저 자체 헤더 파일이 포함되어 있습니다. [한조각
  2. 헤더 파일에는 구문 분석에 필요한 모든 헤더 파일이 포함되어야합니다. [한조각
  3. 헤더 파일에는 구문 분석하는 데 필요한 최소한의 헤더 파일이 있어야합니다. [한조각

이 기사 Doxygen의 구문 분석을 사용하여 #include 제거 기술을 설명합니다. 그것은 단지 PERL 스크립트이므로 사용하기 쉽습니다.

무료 도구가 있습니다 파일 종속성 감시자를 포함하십시오 Visual Studio에 통합 될 수 있습니다. 불필요한 #includes를 빨간색으로 표시합니다.

어쩌면 조금 늦었을 수도 있지만, 한 번은 당신이 원하는 것을 한 WebKit Perl 스크립트를 찾았습니다. 내가 믿는 적응이 필요할 것입니다 (Perl에 정통하지는 않습니다). 그러나 트릭을 수행해야합니다.

http://trac.webkit.org/browser/branches/old/safari-3-2-branch/webkittools/scripts/find-extra-includes

(트렁크는 더 이상 파일이 없기 때문에 오래된 지점입니다)

불필요한 #include 파일에는 두 가지 유형이 있습니다.

  1. 모듈 (.c, .cpp)에서 실제로 필요하지 않은 헤더 파일
  2. 모듈에는 헤더 파일이 필요하지만 직접 또는 간접적으로 두 번 이상 포함됩니다.

내 경험에는 그것을 감지하는 데 잘 작동하는 두 가지 방법이 있습니다.

  • gcc -h 또는 cl.exe /showincludes (해결 문제 2)

    실제 세계에서는 모든 MakeFile이 CFLAGS 옵션을 무시하지 않으면 CFLAGS = -H를 내보낼 수 있습니다. 또는 내가 사용했듯이 CC/G ++ 래퍼를 만들어 $ (CC) 및 $ (CXX)의 각 호출에 -H 옵션을 강제로 추가 할 수 있습니다. 래퍼 디렉토리를 $ 경로 변수로 선발하면 Make는 대신 래퍼 명령을 사용합니다. 물론 래퍼는 실제 GCC 컴파일러를 호출해야합니다. MakeFile이 GCC를 직접 사용하면이 트릭이 변경되어야합니다. $ (CC) 또는 $ (CXX) 대신 또는 묵시적 규칙 대신.

    명령 줄을 조정하여 단일 파일을 컴파일 할 수도 있습니다. 그러나 전체 프로젝트를 위해 헤더를 청소하려면. 다음으로 모든 출력을 캡처 할 수 있습니다.

    깨끗하게 만드십시오

    2> & 1 |를 만드십시오 티 결과 .txt

  • PC-Lint/Flexelint (1과 2 모두 문제 해결)

    +e766 옵션을 추가하십시오.이 경고는 다음과 같습니다. 미사용 헤더 파일.

    pclint/flint -vf ...

    이로 인해 Pclint 출력이 포함되어있어 헤더 파일이 포함되며 중첩 헤더 파일은 적절하게 들여 쓰기됩니다.

이 논의를 끝내기 위해 : C ++ 전처리 기가 완료되고 있습니다. 포함이 불필요한 지 여부는 시맨틱 속성입니다. 따라서 Rice의 정리에서 포함 된 것이 불필요한 지 여부는 명확하지 않습니다. (항상 올바르게) 포함이 불필요한 지 여부를 감지하는 프로그램이있을 수 없습니다.

여기 간단합니다 불필요한 헤더를 식별하는 무차별 인력 방법에는 포함됩니다. 완벽하지는 않지만 "명백한"불필요한 포함을 제거합니다. 이것들을 제거하는 것은 코드를 정리하는 데 큰 도움이됩니다.

그만큼 스크립트 GitHub에서 직접 액세스 할 수 있습니다.

Gimpel 소프트웨어 PC Lint 컴파일 장치에 포함 파일이 두 번 이상 포함 된 시점에 대해보고 할 수 있습니다., 그러나 찾을 수없는 방식으로 필요하지 않은 파일을 포함 할 수 없습니다.

편집하다: 할 수 있습니다. 보다 Itsmatt의 대답

클리온, JetBrains의 C/C ++ IDE는 중복성이 포함되어 있습니다. 편집자에서는 회색이지만 기능도 있습니다. 현재 파일 또는 전체 프로젝트에 포함 된 최적화.

그래도이 기능에 대한 비용을 지불한다는 것을 알았습니다. Clion은 처음로드시 프로젝트를 스캔하고 분석하는 데 시간이 걸립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top