2009-12-05 13 views
6

Gibt es in einer CPP-Datei einen Unterschied/Präferenz?Typedef innerhalb/außerhalb anonymer Namespace?

// file scope outside any namespace 
using X::SomeClass; 
typedef SomeClass::Buffer MyBuf; 

v/s

namespace { // anonymous 
    using X::SomeClass; 
    typedef SomeClass::Buffer MyBuf; 
} 

Antwort

5

Es platzieren typedefs in anonymen Namespaces nicht viel Sinn. Die Hauptanwendung für anonyme Namespaces besteht darin, eine Symbolkollision zwischen Übersetzungseinheiten zu vermeiden, indem Definitionen mit externen Verknüpfungen in ihnen platziert werden.

+0

Hmm Ich dachte, dass der anonyme Namespace Geltungsbereich über den gesamten Dateiinhalt hatte, einschließlich anderer Namespaces in der Datei, was ihn identisch machen würde, Dinge in den Dateibereich zu setzen (außer für externe Verknüpfungsregeln). Ich war mir nicht sicher, ob externe Verknüpfungsregeln für syntaktischen Zucker wie typedefs und using relevant sein würden. – Jay

+0

Sie haben Recht, die using-Deklaration in den anonymen Namespace zu platzieren oder nicht, ändert nichts. Ich lag falsch. Ich habe das bearbeitet. – Thomas

7

Ich würde sagen, dass die zweite Verwendung ziemlich ungewöhnlich ist, zumindest in dem Code, den ich bisher gesehen habe (und ich habe ziemlich viel C++ Code gesehen). Können Sie erklären, was der Grund für die zweite Technik ist?

Normalerweise verwenden Sie einen anonymen Namespace in einer C++ - Implementierungsdatei, um das gleiche zu erreichen, was "statisch" in C tun würde (oder C++, aber wir werden es beschönigen), nämlich die Sichtbarkeit der Symbole zu beschränken die aktuelle Übersetzungseinheit. Der typedef erzeugt keine Symbole, die exportiert werden, damit der Linker sie sehen kann, da sie nichts "konkretes" im Sinne von etwas Konkretem erzeugen, mit dem Sie verlinken könnten.

Meine Empfehlung? Ich würde mit der ersten Notation gehen. Der zweite fügt eine unnötige Komplikation hinzu und kauft meiner Meinung nach nichts.

+0

Apropos mit dem Namespace {} anstelle von statisch zu sein scheint mir ein Hack zu sein, und ich mochte oder benutzte es nie. Wenn sie sich Sorgen um die 9 Millionen verschiedenen Anwendungen von Static machten, sollten sie ein neues Keyword eingeführt haben. –

+2

Seltsamerweise bevorzuge ich den anonymen Namespace statt statisch, obwohl ich meinen fairen Anteil an C-Programmierung gemacht habe. Es sind genau die 9 Millionen Benutzungen und das Zählen von Static, die mich dazu bringen, anonyme Namespaces zu verwenden. Plus, ich finde es ein wenig prägnanter und es ist schwieriger zu vermasseln, als zu vergessen, etwas mit "statisch" voranzutreiben. –

+0

Ich hatte eine Reihe von Debug-Sachen im anonymen Namensraum, der jetzt weg ist. Die einzige nützliche Sache, die übrig bleibt, sind die typedefs und using, also habe ich darüber debattiert, ob ich sie in den Dateibereich verschieben und den anonymen Namespace verwerfen soll. – Jay