Considera le possibili cose che possono essere trovate in un file di intestazione.
- Macro preprocessore. Questi saranno disponibili da
#include
fino alla fine del file .c
che include l'intestazione. Le macro di preprocessore non sono interessate all'ambito del blocco C (parentesi graffe), quindi anche se l'intestazione si trova all'interno di una funzione, le macro saranno ancora disponibili dopo la fine del blocco.
- Dichiarazioni di tipi, variabili e funzioni. Il loro ambito sarà il blocco in cui si trova la direttiva
#include
. Di solito va bene. Tuttavia, funziona solo una volta. Quasi tutti i file includono i controlli intestazione, in modo che se il file viene incluso più di una volta (cosa che spesso accade a causa di intestazioni che richiedono altre intestazioni) il suo contenuto viene elaborato solo una volta. Quindi se #include
la stessa intestazione in più funzioni, le dichiarazioni saranno disponibili solo la prima volta.
- Definizioni di funzioni (o variabili, ma ciò è estremamente raro nelle intestazioni). A volte le intestazioni contengono piccole funzioni
static
che il compilatore può incorporare. Ciò causerà il fallimento della compilazione se la direttiva #include
è all'interno della funzione, poiché (salvo alcune estensioni del compilatore) non è possibile definire una funzione all'interno di un'altra funzione.
Quindi non è solo una questione di stile: #include
all'interno di una funzione spesso semplice non funziona.
Puoi mettere una direttiva #include
ovunque sull'ambito del file (ad esempio all'esterno di una funzione) senza gravi effetti tecnici. Le entità che definisce saranno disponibili solo sotto la riga #include
. È soprattutto una questione di stile, ma è inusuale e inutile, quindi confonderà i manutentori. Può anche portare a errori confusi se si definisce una variabile o una funzione con lo stesso nome di qualcosa dichiarato in un'intestazione, poiché in tal caso qualsiasi discrepanza verrà riportata nell'intestazione (o in un'intestazione inclusa in un'intestazione inclusa ... inclusa in quell'intestazione ), probabilmente usando una sintassi specifica per l'implementazione, piuttosto che nel tuo codice.
Quindi sì, è cattivo. Raggruppa tutte le tue direttive #include
nella parte superiore del file, con nient'altro che commenti e occasionalmente #pragma
o #define
se indicato dalla documentazione dell'implementazione.