2013-03-22 4 views
7

Es ist considered bad practiceusing namespace in C++ - Header zu verwenden. Ist es ähnlich eine schlechte Idee, namespace aliasing in einem Header zu verwenden, und jede Implementierungsdatei sollte die Aliase deklarieren, die es verwenden möchte?Soll C++ - Namespace-Aliasing in Headerdateien verwendet werden?

Da Header die Orte sind, an denen Sie vollständig spezifizierte Namen verwenden (da wir keine Namespaces in Headern verwenden), wären Aliases zwar nützlich, würden aber trotzdem Ihre Quelle propagieren, wenn #included.

Was ist die beste Vorgehensweise hier? Und was ist der Geltungsbereich eines Namespace-Alias?

+2

Wenn Sie alles in Ihrem eigenen Namespace tun, dann ist es in Ordnung, nicht? Ich denke, es ist nur problematisch, wenn Sie es auf globaler Ebene tun. – Pubby

Antwort

3

Wenn Sie einen Namespace alias in der Kopfzeile dieser Alias ​​setzen wird Teil Ihrer (öffentlich) API werden.

namespace lib_v1 { ... } 
namespace lib_v2 { ... } 
namespace lib = lib_v2; 

oder häufiger:

namespace lib { 
    namespace v1 {} 
    namespace v2 {} 
    using v2; 
} 

Auf der anderen Seite, wenn Sie

Manchmal wird diese Technik zu tun ABI kompatibel Versionierung (oder zumindest machen Bruch sichtbar) wie folgt verwendet nur um Tipparbeit zu sparen, ist es wahrscheinlich keine so gute Idee. (Immer noch viel besser als mit einer using Direktive)

1

Ich mache es mit unbenannte Namensräume auf diese Weise:

#include <whatyouneed> 
... 
namespace { 

typedef ... 
using .. 
namespace x = ... 

// anything you need in header but shouldn't be linked with original name 

} 

// normal interface 
class a: public x::... 
+0

Ich habe dieses Paradigma nicht vorher gesehen. Ich werde auf andere Leute warten, um zu wiegen, bevor ich mich entscheide, ob ich es benutzen will :) –

+0

siehe auch http://stackoverflow.com/questions/357404/why-are-unnamed-namespaces-use-and-what- are-this-benefits – podshumok

+1

das heißt, namenlose Namespaces in Implementierungsdateien zu verwenden, unterscheidet sich das nicht sehr von der Verwendung in Header-Dateien? Alles, was du in diesen Namespace stellst, ist immer noch für Dateien sichtbar, die es (in meinem Test sowieso) enthalten. –

Verwandte Themen