2010-04-05 7 views
5

Sorry für diese dumme Frage, aber gibt es eine Möglichkeit, using Direktiven auf die aktuelle Datei zu beschränken, so dass sie nicht auf die Dateien, die #include diese Datei weitergeben?Beschränkung `using` Direktiven auf die aktuelle Datei

+0

Sie können jedoch die Verwendung von Direktiven auf einen Nicht-Dateibereich beschränken, z. B. auf einen Namespace oder eine Funktion. –

+2

Es ist viel besser, die 'using'-Direktive nicht in Headern anzuwenden. –

+0

@David: Ich hasse es etwas wie 'std :: map >' wenn ich 'map >' eingeben kann . – missingfaktor

Antwort

4

Vielleicht könnte das Umschließen des einzubeziehenden Codes in seinem eigenen Namespace das gewünschte Verhalten
erreichen, da sich Namensräume auf den Umfang auswirken.

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

und in einer anderen Datei

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

Hey, cooler Trick! Ich denke, ich werde für diesen gehen; Danke vielmals! :) – missingfaktor

15

Nein, das ist nicht der Fall, weshalb Sie keine Direktiven in Header-Dateien oder anderen Dateien verwenden sollten, die Sie enthalten.

+3

Um dies ein wenig zu erweitern - der Präprozessor (der '# include' und andere #' - Befehle handhabt) wird ausgeführt, bevor der Compiler den Code jemals sieht. Die 'using'-Direktive und andere Standardschlüsselwörter werden vom Compiler verarbeitet. Was den Compiler anbelangt, sind die Header-Dateien also eigentlich keine separaten Dateien - sie sind Code, der sich in jeder Datei befindet, in der sie enthalten sind, also auch "using" Direktiven, die du vielleicht hineinlegst. – Amber

+2

Aah ... traurig. Danke für die Antwort trotzdem. – missingfaktor

+0

@Rahul Es ist nicht so schlimm - Sie können (und sollten) natürlich 'using' Direktiven in Ihren .cpp Dateien verwenden. –

4

Technisch Sie sollten sie bis zu einem gewissen internen Namespace importieren und dann die Dinge in dieser sichtbar für den Anwender bedeutet im Namensraum deklariert machen können.

#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'; 
} 

Nicht sicher, ob es der Mühe wert ist und wie es gut spielt mit „-Argument abhängigen Lookup“.

+0

Zu viel Mühe in der Tat. Aber immer noch eine nette Arbeit. Also, +1. :) – missingfaktor

Verwandte Themen