Dovrebbe essere specificata un'intestazione di inclusione standard in ogni file o come parametro del compilatore?

6

Ho un file come questo:

#ifndef STDINCLUDE
#define STDINCLUDE

#include <memory>
#include <stdexcept>

#endif

Voglio che questo file sia incluso in ogni file di intestazione, perché uso così tanto materiale da quelle intestazioni. È preferibile includerlo tramite le opzioni del compilatore ( -I stdinclude.hpp ), o dovrei includerli fisicamente in ogni intestazione? (%codice%). Nota che sto tentando di essere di mentalità multi-piattaforma. Io uso cmake per servire atleast Unix e Windows.

    
posta Max 03.03.2012 - 20:31
fonte

3 risposte

17

Per molti compilatori, incluso gcc, l'opzione -I specifica una directory per cercare i file include, non un singolo file. Non conosco un'opzione per includere un singolo file. Per prima cosa, un tale oggetto non specificerebbe dove nella sorgente inserire la direttiva #include .

Anche se esistesse una tale opzione, non la consiglierei di usarla. La scelta di quali intestazioni includere sono informazioni che dovrebbero essere nel file sorgente. Se dovessi specificarlo sulla riga di comando, dovresti disaccoppiare quelle informazioni dal file sorgente (presumibilmente in un Makefile o qualcosa di simile), il che renderebbe il codice sorgente più difficile da comprendere e da mantenere. E chiunque provi a trasferire il tuo software su un altro sistema di compilazione dovrebbe portare tale opzione separatamente.

Presumibilmente la maggior parte dei tuoi file sorgente include intestazioni diverse da stdinclude.hpp . Includere quel file tramite l'opzione del compilatore e tutto il resto tramite direttive #include esplicite, è arbitrario e potenzialmente confuso.

Avendo un esplicito

#include <stdheader.hpp>

o, poiché fa parte del tuo progetto:

#include "stdheader.hpp"

fai sapere al lettore che il tuo codice utilizza qualcosa definito in quell'intestazione.

Se questo è tutto per il tuo file stdheader.hpp , potresti anche considerare di lasciarlo cadere e di utilizzare ogni file sorgente

#include <memory>
#include <stdexcept>

direttamente. In questo modo, i tuoi lettori sapranno esattamente cosa è #include d e non dovranno sapere né preoccuparsi di ciò che è in stdheader.hpp . Questo è un vantaggio piuttosto buono per una riga in più per file. Se stdheader.h diventa più elaborato, utilizzarlo potrebbe avere più senso.

    
risposta data 03.03.2012 - 20:36
fonte
3

È una buona idea per #include qualsiasi file su cui si basa un file sorgente. Se hai un set standard di intestazioni da includere in ogni file, #include li tutto in un singolo file di intestazione come stdinclude.hpp . In questo modo, devi solo modificare un file quando cambi il set di intestazioni standard.

Detto questo, non si desidera compilare ciascuno di questi file di intestazione nel set standard ogni volta che si compila uno dei file sorgente. La maggior parte dei compilatori fornisce un meccanismo per la creazione di intestazione precompilata solo per questo motivo. Un'intestazione precompilata ti consente di evitare di dover compilare ripetutamente gli stessi file di intestazione, riducendo significativamente i tempi di compilazione del tuo progetto.

    
risposta data 09.07.2012 - 04:30
fonte
1

Idealmente per un codice multipiattaforma vorrei provare a mantenere le cose semplici (ce ne sono molte là fuori per avere più idee)

#ifdef Linux 
    #include <stdio.h> 
#elif WIN32
    #include <something.h>
#else
  #error "Which OS?"
#endif 

Dato questo, ora darò -DLINUX o -DWIN32 sulla riga di comando.

Qual è la differenza fondamentale?

Man mano che il codice si evolve, molti altri file vengono aggiunti o rimossi sotto gli include, ma mantenendo questo approccio, il ragazzo che compila non deve ricordare di doverlo modificare.

Idealmente, tutte le include devono essere scritte solo staticamente. Ma il passaggio può essere fatto più come funzionalità (modulo, sistema operativo, dipendenze) piuttosto che come disordine individuale.

    
risposta data 04.03.2012 - 04:42
fonte

Leggi altre domande sui tag