2010-04-05 17 views
5

Ci scusiamo per questa domanda stupida, ma esiste un modo per limitare le direttive using al file corrente in modo che non si propaghino ai file che questo file è #include?Restringere le direttive `using` al file corrente

+0

È possibile limitare l'utilizzo delle direttive a un ambito non di file, ad esempio uno spazio dei nomi o una funzione. –

+2

È molto meglio non applicare la direttiva 'using' nelle intestazioni. –

+0

@David: Odio scrivere qualcosa come 'std :: map >' quando riesco a digitare 'map >' . – missingfaktor

risposta

4

Forse il wrapping del codice da includere nel proprio spazio dei nomi potrebbe ottenere il comportamento
desiderato, poiché gli spazi dei nomi hanno effetto sull'ambito.

// FILENAME is the file to be included 
namespace FILENAME_NS { 
    using namespace std; 
    namespace INNER_NS { 
     [wrapped code] 
    } 
} 
using namespace FILENAME_NS::INNER_NS; 

e in qualche altro file

#include <FILENAME> 
// std namespace is not visible, only INNER_NS definitions and declarations 
... 
+0

Ehi, bel trucco! Penso che andrò per questo; Molte grazie! :) – missingfaktor

15

No, non c'è, motivo per cui non si dovrebbe usare le direttive nei file di intestazione, o qualsiasi altro file che si include.

+3

Per estenderlo un po '- il preprocessore (che gestisce i comandi '# include' e altri' # '-commands) viene eseguito prima che il compilatore veda il codice. La direttiva 'using' e qualsiasi altra parola chiave standard sono elaborate dal compilatore. Quindi, per quanto riguarda il compilatore, i file header non sono in realtà file separati - sono il codice che si trova in ogni file in cui sono '# include''d, e quindi lo è anche l'uso di' using'. direttive che potresti inserire. – Amber

+2

Aah ... triste. Grazie comunque per la risposta. – missingfaktor

+0

@Rahul Non è così male - puoi (e dovresti) ovviamente usare le direttive 'using' nei tuoi file .cpp. –

4

Tecnicamente si dovrebbe essere in grado di importarli in un certo spazio dei nomi interno, e poi fare le cose dichiarate in quella visibile nello spazio dei nomi significato per l'utente.

#ifndef HEADER_HPP 
#define HEADER_HPP 

#include <string> 

namespace my_detail 
{ 
    using std::string; 
    inline string concatenate(const string& a, const string& b) { return a + b; } 
} 

namespace my_namespace 
{ 
    using my_detail::concatenate; 
} 

#endif 

#include <iostream> 
#include "header.hpp" 

using namespace my_namespace; 

int main() 
{ 
    std:: //required 
    string a("Hello "), b("world!"); 
    std::cout << concatenate(a, b) << '\n'; 
} 

Non so se vale la pena e come ben si gioca con "lookup argomento-dipendente".

+0

Troppi problemi davvero. Ma ancora un bel lavoro in giro. Quindi, +1. :) – missingfaktor

Problemi correlati