c++ - cppclean - include what you use




C/C++: rilevamento di#inclusi superflui? (13)

C'è uno strumento gratuito Include Dependencies Watcher che può essere integrato nello studio visivo. Mostra #inclusi superflui in rosso.

Trovo spesso che la sezione delle intestazioni di un file diventa sempre più grande ma non diventa mai più piccola. Durante la vita di un file sorgente, le classi possono essere state spostate e ridimensionate ed è molto probabile che ci siano parecchi #includes che non hanno bisogno di essere lì e più. Lasciandoli lì si prolunga il tempo di compilazione e si aggiungono dipendenze di compilazione non necessarie. Cercare di capire quali sono ancora necessari può essere piuttosto noioso.

Esiste qualche tipo di strumento in grado di rilevare le direttive #include superflue e suggerire quali posso rimuovere in sicurezza?
Lo fa forse?




Esistono due tipi di file #include superflui:

  1. Un file di intestazione non è effettivamente necessario dal modulo (.c, .cpp)
  2. Un modulo di intestazione è necessario dal modulo ma viene incluso più volte, direttamente o indirettamente.

Ci sono 2 modi nella mia esperienza che funziona bene a rilevarlo:

  • gcc -H o cl.exe / showincludes (risolvere il problema 2)

    Nel mondo reale, è possibile esportare CFLAGS = -H prima del make, se tutto il Makefile non ha l'override delle opzioni CFLAGS. O come ho usato, puoi creare un wrapper cc / g ++ per aggiungere le opzioni -H forzatamente ad ogni richiamo di $ (CC) e $ (CXX). e anteponi la directory del wrapper alla variabile $ PATH, quindi il tuo make userà invece il comando wrapper. Ovviamente il tuo wrapper dovrebbe invocare il vero compilatore gcc. Questo trucco deve cambiare se il tuo Makefile usa direttamente gcc. invece di $ (CC) o $ (CXX) o regole implicite.

    Puoi anche compilare un singolo file modificando la riga di comando. Ma se vuoi pulire le intestazioni per l'intero progetto. Puoi catturare tutto l'output di:

    rendere pulito

    fai 2> & 1 | tee result.txt

  • PC-Lint / FlexeLint (risolvere il problema sia 1 che 2)

    assicurati di aggiungere le opzioni + e766, questo avviso riguarda: i file di intestazione non utilizzati.

    pclint / flint -vf ...

    Ciò causerà l'inclusione dei file di intestazione inclusi nell'output di pclint, i file di intestazione annidati saranno rientrati in modo appropriato.


Ho provato a usare Flexelint (la versione unix di PC-Lint) e ho avuto risultati un po 'misti. Questo è probabile perché sto lavorando su una base di codice molto ampia e intricata. Consiglio di esaminare attentamente ogni file segnalato come non utilizzato.

La principale preoccupazione sono i falsi positivi. Più include della stessa intestazione sono riportati come un'intestazione non necessaria. Questo è un problema poiché Flexelint non ti dice quale riga è inclusa nell'intestazione o dove è stata inclusa in precedenza.

Uno dei modi in cui gli strumenti automatici possono sbagliare:

In A.hpp:

class A { 
  // ...
};

In B.hpp:

#include "A.hpp

class B {
    public:
        A foo;
};

In 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

Se segui ciecamente i messaggi di Flexelint, cancelli le tue dipendenze #include. Ci sono più casi patologici, ma fondamentalmente avrete bisogno di ispezionare personalmente le intestazioni per ottenere i migliori risultati.

Consiglio vivamente questo articolo su Physical Structure e C ++ dal blog Games from within. Raccomandano un approccio completo per ripulire il pasticcio #include:

Linee guida

Ecco una serie distinta di linee guida dal libro di Lakos che minimizzano il numero di dipendenze fisiche tra i file. Li ho usati per anni e sono sempre stato davvero contento dei risultati.

  1. Ogni file cpp include prima il proprio file di intestazione. [Omissis]
  2. Un file di intestazione deve includere tutti i file di intestazione necessari per analizzarlo. [Omissis]
  3. Un file di intestazione dovrebbe avere il minimo numero di file di intestazione necessari per analizzarlo. [Omissis]

Il browser di refactoring di CScout grado di rilevare le direttive di superfluo includere nel codice C (purtroppo non C ++). Puoi trovare una descrizione di come funziona in this articolo di giornale.


Mi dispiace (ri) postare qui, le persone spesso non espandono i commenti.

Controlla il mio commento su crashmstr, FlexeLint / PC-Lint farà questo per te. Messaggio informativo 766. La sezione 11.8.1 del mio manuale (versione 8.0) discute questo.

Inoltre, e questo è importante, continua a ripetere fino a quando il messaggio non scompare . In altre parole, dopo aver rimosso le intestazioni inutilizzate, rieseguire lanugine, altri file di intestazione potrebbero essere diventati "non necessari" una volta rimosse alcune intestazioni non necessarie. (Potrebbe sembrare sciocco, leggerlo lentamente e analizzarlo, ha senso).


Non è automatico, ma Doxygen genererà diagrammi di dipendenza per i file #inclusi. Dovrai attraversarli visivamente, ma possono essere molto utili per ottenere un'immagine di cosa sta usando cosa.


Pensavo che PCLint avrebbe fatto questo, ma sono passati alcuni anni da quando l'ho guardato. Potresti controllare.

Ho guardato questo blog e l'autore ha parlato un po 'della configurazione di PCLint per trovare gli include inutilizzati. Potrebbe meritare un'occhiata.


Per concludere questa discussione: il preprocessore c ++ è completo. È una proprietà semantica, se l'inclusione è superflua. Quindi, dal teorema di Rice risulta che è indecidibile se un inclusivo sia superfluo o meno. Non ci può essere un programma, che (sempre correttamente) rileva se una inclusione è superflua.


Se stai usando Eclipse CDT puoi provare http://includator.com che è gratuito per i beta tester (al momento di questa stesura) e rimuove automaticamente #inclusi superflui o aggiunge quelli mancanti. Per gli utenti che dispongono di FlexeLint o PC-Lint e utilizzano Elicpse CDT, http://linticator.com potrebbe essere un'opzione (anche gratuita per il beta test). Mentre utilizza l'analisi di Lint, fornisce soluzioni rapide per rimuovere automaticamente le affermazioni #include superflue.


Questo articolo spiega una tecnica di rimozione #include utilizzando l'analisi di Doxygen. Questo è solo uno script perl, quindi è abbastanza facile da usare.


CLion , l'IDE C / C ++ di JetBrains, rileva che il ridondante include CLion . Sono visualizzati in grigio nell'editor, ma ci sono anche funzioni per l' ottimizzazione incluse nel file corrente o nell'intero progetto .

Ho trovato che si paga per questa funzionalità però; CLion impiega un po 'di tempo a scansionare e analizzare il tuo progetto quando viene caricato per la prima volta.





dependencies