2010-12-12 10 views
94

W jaki sposób nienazwane przestrzenie nazw są lepsze od słowa kluczowego static?Lepsza jakość bezimiennej przestrzeni nazw niż statyczne?

+0

Jednak nienazwane przestrzenie nazw nie są wystarczającym zamiennikiem _namespace-static_, zgodnie z komitetem normalizacyjnym. [Wciąż istnieje kilka przypadków] (http://stackoverflow.com/q/8460327/183120) gdzie nienazwane przestrzenie nazw zawodzą i działa tylko 'static'. – legends2k

Odpowiedz

100

jesteś w zasadzie zgodnie z rozdziałem 7.3.1.1 $/2 od standardu C++,

Użycie hasła statycznego jest przestarzałe podczas deklarowania obiektów w zakresie przestrzeni nazw ; Nienazwany obszar nazw zapewnia lepszą alternatywę .

nazw Unnamed jest lepsza hasła statycznego, przede wszystkim dlatego, że kluczowe static ma zastosowanie wyłącznie do zmiennych deklaracje i funkcji, a nie do zdefiniowanych przez użytkownika typów.

Poniższy kod jest ważny w C++

//legal code 
    static int sample_function() { /* function body */ } 
    static int sample_variable; 

Ale ten kod nie jest poprawny:

//illegal code 
    static class sample_class { /* class body */ }; 
    static struct sample_struct { /* struct body */ }; 

więc rozwiązanie jest nienazwany-nazw, co jest to,

//legal code 
    namespace 
    { 
     class sample_class { /* class body */ }; 
     struct sample_struct { /* struct body */ }; 
    } 

Mam nadzieję, że wyjaśnia, dlaczego unnamed-namespace jest lepszy niż .

Należy również zauważyć, że użycie słowa kluczowego static jest przestarzałe podczas deklarowania obiektów w zakresie przestrzeni nazw (zgodnie ze standardem).

+11

Bardziej ogólnie, nienazwana przestrzeń nazw umożliwia połączenie zewnętrzne. To właśnie umożliwia deklarację klasy jednostki lokalnej do tłumaczenia. Pozwala również na np. stała ciągi powiązań zewnętrznych, która ma być używana jako argument szablonu. –

+0

@Alf: To prawda. Dzięki za dodanie. :-) – Nawaz

+9

Jak zauważył Fred Nurk w innej odpowiedzi, wydaje się, że ta "przestarzała" uwaga została usunięta z najnowszego FCD C++ 0x (n3225). –

6

C++ standard czyta w punkcie 7.3.1.1 bez nazw nazw ustęp 2:

Użycie hasła statycznego jest przestarzałe podczas deklarowania obiektów w zakresie przestrzeni nazw, bezimienny-namespace zapewnia doskonała alternatywa.

Statyczny dotyczy tylko nazw obiektów, funkcji i anonimowych związków, a nie deklaracji typu.

+1

Nie, nie ma. Zrobił to projekt. Kolejny szkic wkrótce potem odwrócił tę głupią zmianę. –

5

Jest ciekawy problem związany z tym:

Załóżmy użyć static kluczowe lub nienazwanej namespace zrobić jakąś funkcję wewnętrznego modułu (JT), ponieważ ta funkcja ma być używana wewnętrznie przez moduł i niedostępne poza nim. (Nienazwane namespace s mają tę zaletę, że oprócz funkcji zawierają również definicje danych i typów.

Z czasem plik źródłowy implementacji twojego modułu powiększa się i chciałbyś podzielić go na kilka oddzielnych plików źródłowych, co pozwoliłoby na lepszą organizację kodu, szybsze znajdowanie definicji i samodzielne kompilowanie .

Ale teraz w obliczu problemu: Funkcje te nie mogą już być static do modułu, ponieważ static rzeczywistości nie odnoszą się do modułu, ale do pliku (JT) źródłowego. Jesteś zmuszony uczynić je innymi niż static, aby umożliwić im dostęp z innych części (plików obiektów) tego modułu. Ale to oznacza również, że nie są już ukryte/prywatne dla modułu: mając zewnętrzne powiązania, można uzyskać do nich dostęp z innych modułów, co nie było pierwotną intencją.

Nienazwany namespace również nie rozwiąże problemu, ponieważ jest on również zdefiniowany dla konkretnego pliku źródłowego (jednostki tłumaczeniowej) i nie można uzyskać do niego dostępu z zewnątrz.

Byłoby świetnie, gdyby można było określić, że jakiś namespace jest private, czyli to, co jest w nim zdefiniowane, ma być używane wewnętrznie przez moduł, do którego należy. Ale oczywiście C++ nie ma takiej koncepcji jak "moduły", tylko "jednostki tłumaczeniowe", które są ściśle związane z plikami źródłowymi.

+2

W każdym razie byłoby to rozwiązanie hakerskie i ograniczone, ale można dołączyć plik (y) cpp z wewnętrznymi funkcjami statycznymi lub pseudonimowymi do "głównych" plików cpp. Następnie wyłącz te "satelitarne" pliki cpp z kompilacji i gotowe. Jedyny problem, jeśli masz dwa lub więcej "głównych" plików cpp i obydwaj chcą używać tej fajnej funkcji z jednego z "satelitarnych" plików cpp ... – Sergey

Powiązane problemy