Come posso “non utilizzare” uno spazio dei nomi?

Uno dei capricci del mio sistema di sviluppo (Codegear C ++ Builder) è che alcune delle intestazioni generate automaticamente insistono nell’avere …

using namespace xyzzy 

… dichiarazioni in loro, che hanno un impatto sul mio codice quando meno lo voglio o lo aspetto.

C’è un modo in cui posso in qualche modo annullare / annullare una precedente istruzione “using” per evitare questo.

Può essere…

 unusing namespace xyzzy; 

No. Ma c’è una soluzione potenziale: se si racchiude la direttiva include in uno spazio dei nomi proprio, come questo …

 namespace codegear { #include "codegear_header.h" } // namespace codegear 

… quindi gli effetti di qualsiasi direttiva usando all’interno di quell’intestazione sono neutralizzati.

Questo potrebbe essere problematico in alcuni casi. Ecco perché ogni guida in stile C ++ consiglia vivamente di non inserire una direttiva “using namespace” in un file di intestazione.

No, non è ansible non utilizzare uno spazio dei nomi. L’unica cosa che puoi fare è mettere l’ using namespace dei using namespace -statmento un blocco per limitarne l’ambito.

Esempio:

 { using namespace xyzzy; } // stop using namespace xyzzy here 

Forse puoi cambiare il modello utilizzato per le intestazioni generate automaticamente.

Potresti essere bloccato utilizzando spazi dei nomi espliciti sui conflitti:

 string x; // Doesn't work due to conflicting declarations ::string y; // use the class from the global namespace std::string z; // use the string class from the std namespace 

Per riferimento futuro: poiché la versione XE ha un nuovo valore, è ansible #define per evitare il temuto using namespace System; int l’include: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

Che ne dici di usare sed, perl o qualche altro strumento da riga di comando come parte del processo di compilazione per modificare le intestazioni generate dopo che sono state generate ma prima che vengano utilizzate?

L’esperimento rapido con Visual Studio 2005 mostra che è ansible racchiudere tali intestazioni nel proprio spazio dei nomi denominato e quindi use ciò che è necessario da questo spazio dei nomi (ma non use l’intero spazio dei nomi, poiché introdurrà lo spazio dei nomi che si desidera hide.

 #include #include namespace namespace1 { int t = 10; } namespace namespace2 { int t = 20; } int main() { using namespace namespace1; printf("%d" , t); printf("%d" , namespace2::t); }