2014-07-04 5 views
8

Ich arbeite an einem kleinen persönlichen C++ - Projekt mit STL. Ich mag es nicht, "std::" überall in meinen Header-Dateien zu haben, da ich finde, dass es die Lesbarkeit behindert, aber gleichzeitig möchte ich mir später keine Probleme machen, indem ich using namespace std in eine Header-Datei setze.Begrenzen des Bereichs "Verwenden von Namespace" in einer Header-Datei

Also ich frage mich, ob es einen Weg gibt, den Umfang der using Erklärung zu begrenzen, so dass es auf den Inhalt meiner Header-Datei gilt, aber gilt nicht für Dateien, die sie enthalten. Ich habe verschiedene Dinge wie diese versucht

{ 
    using namespace std; 

    // header file contents here 
} 

aber es scheint, dass die Einführung eines Bereichs auf diese Weise außerhalb einer Funktionsdefinition nicht erlaubt ist. Gibt es eine Möglichkeit zu tun, wonach ich suche?

Bitte beachten Sie: Ich bin wirklich nicht daran interessiert, zu diskutieren, ob dies eine gute Idee, ich will nur wissen, ob es getan werden kann.

+1

Meine fehlerhafte Antwort wurde gelöscht. Entschuldigung. Ich qualifiziere Namen immer vollständig in Kopfzeilen (und sogar in cpp-Dateien) aus Gewohnheit. Es ist ziemlich üblich, Code-Basen zu haben, die ihren eigenen Vektor deklarieren, also ist es hilfreich, std :: vector zu sehen, um die Mehrdeutigkeit zu vermeiden. Dies hilft jedoch nicht bei der Beantwortung Ihrer Frage. – M2tM

+0

@ M2tM danke, kein Problem. – Nathaniel

Antwort

5

Ja, ich denke, das kann getan werden.

Um dies zu erreichen, müssen Sie Ihren eigenen Namespace erstellen. Ich habe einen Code geschrieben, der wie erwartet funktioniert.

Header-Datei wie folgt aussieht:

#include <iostream> 
namespace my_space { 
    using namespace std; 

    void mprint() 
    { 
     /* 
     * This is working. It means we can access 
     * std namespace inside my_space. 
     */ 
     cout << "AAA" << endl; 
    } 
}; 

Implementierung Datei wie folgt aussieht:

#include "my_header.h" 

int main() 
{ 

    /* 
    * Working Fine. 
    */ 
    my_space::mprint(); 

    /* 
    * It gives a compile time error because 
    * it can't access the std namespace 
    */ 
    cout << "CHECK" << endl; 
    return 0; 
} 

Bitte lassen Sie mich wissen, wenn dies nicht Ihre Anforderung nicht erfüllt. Daran können wir arbeiten.

+3

Beachten Sie, dass dies unbeabsichtigte Folgen haben kann. Indem Sie ein 'using namespace blah;' in einem anderen Namespace in einer Header-Datei einfügen, ziehen Sie absichtlich * everything * in den Namespace ein, der in der aktuellen Übersetzungseinheit enthalten ist und nun * your * header enthält, aber nicht des Weiteren. Eine andere Übersetzungseinheit, die denselben Header enthält, kann Deklarationen und Definitionen in den verwendeten Namespace ziehen, wobei der Header (Ihr) diese Tatsache nicht kennt. Es ist einer der vielen Gründe, 'namespace' zu ​​verwenden ist ideal geeignet um * nach * alle Includes in einer TU zu etablieren. – WhozCraig

+0

Ich könnte mit einer Lösung wie dieser gehen, aber das Problem ist, dass es die Falte an einem Ort nur drückt, damit es in einem anderen auftaucht. Mein Header-Datei-Code ist schön frei von 'std ::', aber der Code, der es verwendet, ist gepfeffert mit 'my_space ::'. Wenn ich 'namespace my_space' benutze, wird dies alles von' std' in den globalen Namespace importieren, was wir vermeiden wollten. – Nathaniel

+0

Ich stimme dir zu, Nathaniel. Aber Sie müssen die bittere Pille an der einen oder anderen Stelle schlucken. –

3

Nein, es kann nicht getan werden. Ihr Versuch, einen Bereich im Header einzuführen, ist genau deshalb fehlgeschlagen, weil es keinen Header-Bereich gibt - Header-Dateien haben während der Kompilierung keinen speziellen Status. Die Übersetzungseinheiten sind eine Quelldatei, die erhalten wird, nachdem der Präprozessor damit fertig ist. Daher erweitern alle include Direktiven einfach die entsprechenden Header-Dateien. Dies verhindert, dass Sie den Inhalt der Headerdatei in irgendeiner Weise kontextspezifisch machen können.

Verwandte Themen