2010-04-19 20 views
13

Ho un typedefIn C++, come posso rendere i typedef visibili a tutti i file nel mio progetto?

typedef unsigned int my_type; 

utilizzato in un file. Vorrei renderlo visibile su tutti i miei file, senza inserendolo in un file di intestazione incluso da tutto. Non voglio andare al file di intestazione route perché così com'è questa sarà l'unica dichiarazione nel file di intestazione (e non sembra necessario aggiungere un file solo per questo).

C'è un modo per farlo?

Se invece ho avuto:

typedef X my_type; 

dove X è una classe, avrei bisogno di includere X.h ovunque e avere il typedef alla fine di X.h?

risposta

17

Non voglio andare all'itinerario del file perché, così com'è, questa sarà l'unica dichiarazione nel file di intestazione (e non sembra necessario aggiungere un file solo per questo).
Qual è il problema? Sembra altrettanto inutile evitare di creare un file a tutti i costi.

C'è un modo per farlo?
Non per quanto ne so.

avrei bisogno di includere X.h ovunque e avere il typedef alla fine di X.h?
No, ma probabilmente è la cosa migliore. L'unica ragione per cui dovresti farlo è se X è un modello, e comunque hai bisogno che i template siano nelle intestazioni.

+0

un altro motivo potrebbe essere X essere una dichiarazione in avanti. – peterchen

+0

@peterchen: Quindi X non dovrebbe essere typedef, dovresti usare il nome della classe, X. –

+0

: scrollata di spalle: ci sono pochissimi motivi per digitare typedef un nome di classe "puro" comunque - ma hey, non lo era la mia idea! – peterchen

9

Niente da fare, per quanto posso vedere. Perché non create un file di intestazione globals.h con solo le dichiarazioni che volete ovunque e includetelo?

Non essere tentato di seppellire il tuo typedef da qualche parte e spero che "dato che tutto il resto toglie l'intestazione" che sarà buono come aggiungere un header globale - è estremamente pessima pratica avere intestazioni che non lo sono autonomo.

Inoltre, per evitare che ingombrano lo spazio dei nomi globale creare il proprio:

namespace MyTypes 
{ 
    typedef A B; 
    const unsigned int g_nMyGlobalType = 10; 
    // etc. 
} 

In questo modo è possibile utilizzare le variabili globali in un bel modo ordinato:

MyTypes::B myVar; // etc 
+1

La soluzione di intestazione globale non è molto carina neanche (da un punto di vista di dipendenza), in particolare io consiglierei di NON usarlo come intestazione di default;) –

1

Vorrei utilizzare il file di intestazione percorso, non è così male.

No, non è necessario includere X.h ovunque, solo nei punti in cui si utilizza typedef.

0

No, non c'è modo di aggirare il bisogno di avere il typedef in un file di intestazione che è incluso ovunque ne sia necessario, ma no, non è necessariamente necessario includere anche il file X.h nel secondo caso.

Se hai

typedef X my_type; 

E X è una classe, si potrebbe fare questo (in un'intestazione diversa X.h):

class X; 
typedef X my_type; 

Quali previsionali dichiara X, e quindi crea una digita alias per questo. Quindi, avere X.h includere questo file.

Quindi, se avete solo bisogno il typename incompleta my_type, è possibile includere il file di intestazione typedef molto breve, e hai solo bisogno di includere X.h quando avresti bisogno di una definizione completa per la classe X comunque.

0

Dichiarare qualcosa (ad esempio una classe, typedef, funzione) in un'unità di traduzione (ad esempio file cpp) è in realtà un modo standard per dire "questo è usato solo in questo file", perché è impossibile riferimento da altri file. Le unità di traduzione non hanno idea dell'altra esistenza, a parte le dichiarazioni (ad esempio i prototipi) condivise dai file .h - che non dicono nulla dell'implementazione. È il linker che prende tutte le implementazioni e le incolla insieme in un binario.

Se si desidera che sia visibile all'esterno del file, inserirlo in un file .h e includerlo. Come suggerito da altre risposte, un file .h comune o globale potrebbe essere utile. Alcuni compilatori che utilizzano intestazioni precompilate rendono questo facile - mettilo nell'intestazione precompilata.

Problemi correlati