È un buon stile di programmazione includere tutte le dipendenze necessarie in un'intestazione che le fa riferimento. Spesso questo include dichiarazioni che sono posizionate nel STD & namespace globali (come cstdio). Tuttavia, questo crea problemi quando un secondo programmatore vuole avvolgere un tale file di inclusione in un nuovo spazio dei nomi per incapsulare il primo.
Con questo scenario in mente, c'è un modo per forzare le dichiarazioni nello spazio dei nomi globale? Come esempio concettuale (questo in realtà non verrà compilato):
foo.h --> original definition
// force global namespace, this is redundant when foo is in the global space
// but could be important if foo included into another namespace.
namespace :: {
#include <cstdio>
}
namespace foo {
FILE *somefile;
}
bar.h --> New file, by a new programmer, encapsulating foo.
namespace bar {
# include "foo.h"
FILE *somefile; // bar:somefile, as opposed to bar::foo::somefile
}
Senza il putativo namespace ::{}
finiamo con dichiarazioni come foo::FILE
e foo::printf()
, quando vogliamo solo ::FILE
e ::printf()
.
Le librerie popolari come boost risolvono ciò definendo una gerarchia esplicita. Ciò richiederebbe che foo sappia che farà parte della barra e che lo spazio dei nomi globale includa al di fuori della definizione del namespace locale.
Tuttavia, una buona estensibilità richiede che siamo in grado di usare foo direttamente, OPPURE wrap foo in un nuovo spazio dei nomi, senza dover cambiare foo o include.
Qualcuno sa come farlo?