Le risposte in questo post arrivano molto strongmente contro l'inclusione di intestazioni all'interno di uno spazio dei nomi e Doxygen
è confuso se ciò è fatto (il che suggerisce che il suo team non ha considerato tale utilizzo). Vorrei chiedere se includere intestazioni all'interno di uno spazio dei nomi è giustificato nel seguente caso.
Sto sviluppando un framework di sola intestazione per esplorare una determinata famiglia di algoritmi. Una volta rilasciato, le estensioni sotto forma di file di intestazione saranno fornite dai membri della comunità di ricerca. Un file di intestazione contribuito può implementare un nuovo algoritmo o una politica di un algoritmo esistente o qualcos'altro. A seconda di ciò che la nuova intestazione implementa, verrà inserito nella cartella pertinente.
Gli spazi dei nomi nel framework imitano la struttura delle cartelle. Quindi, considera una cartella A/B/
del framework e supponi che le intestazioni x.h
, y.h
e z.h
siano in quella cartella. Senza includere le intestazioni all'interno degli spazi dei nomi, il file x.h
sarà simile al seguente:
namespace N { // The namespace in which the whole framework resides
namespace A { // Folder A/
namespace B { // Folder A/B/
namespace X { // The facilities provided by x.h are related
... // Definition of the facilities
}
}
}
}
I file y.h
e z.h
inizieranno anche con l'apertura di quattro spazi dei nomi. Inoltre, se un utente contribuisce con w.h
a questa cartella, dovrà ricordarsi di aprire gli spazi dei nomi N
, A
e B
per non interrompere la progettazione.
Nel design alternativo (e meglio a mio avviso), ogni cartella ha un file headers.h
come segue.
A/B/headers.h
è:
namespace B {
#include "x.h"
#include "y.h"
#include "z.h"
}
A/headers.h
è:
namespace A {
#include "B/headers.h"
... // includes headers.h of other sub-folders of A/
}
Allora x.h
assomiglia a questo
namespace X { // The facilities provided by x.h are related
...
}
Esistono validi motivi per non utilizzare questo design alternativo?
Tieni presente che la libreria deve essere inclusa nel .cpp
nel suo insieme (cioè è incluso il header.h
di primo livello). Ciò non comporta tempi di compilazione lunghi, poiché la libreria è strongmente basata su modelli e solo pochi modelli (ad esempio l'algoritmo in esame, le sue politiche e le relative funzionalità) vengono istanziati. Quindi, non mi preoccupo della possibilità di includere erroneamente un'intestazione individuale senza il suo contesto di namespace.
Non ci sono dipendenze in basso (cioè foglia), dove si trovano tutte le intestazioni che implementano le strutture effettive (come x.h
, y.h
e z.h
nell'esempio). Pertanto, un headers.h
al livello inferiore (come A/B/headers.h
nell'esempio) può elencare le intestazioni incluse in ordine alfabetico. Un headers.h
a un livello non inferiore (come A/headers.h
nell'esempio) include headers.h
da ogni sottocartella nell'ordine che rispetta le dipendenze. Tale ordine è fisso (ad esempio tutte le politiche sono incluse prima di tutti gli algoritmi) e gli utenti non dovranno occuparsene.