W jaki sposób nienazwane przestrzenie nazw są lepsze od static
słowa kluczowego?
Odpowiedzi:
Zasadniczo odnosisz się do sekcji §7.3.1.1 / 2 ze standardu C ++ 03,
Używanie słowa kluczowego static jest przestarzałe podczas deklarowania obiektów w zakresie przestrzeni nazw; nienazwana przestrzeń nazw stanowi lepszą alternatywę.
Zauważ, że ten akapit został już usunięty w C ++ 11. static
funkcje są według standardu nie są już przestarzałe!
Niemniej jednak przestrzenie nazw bez nazw są lepsze od słowa kluczowego static, głównie dlatego, że słowo kluczowe static
ma zastosowanie tylko do deklaracji zmiennych i funkcji, a nie do typów zdefiniowanych przez użytkownika .
Poniższy kod obowiązuje w C ++
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
Ale ten kod NIE jest ważny:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
Rozwiązaniem jest więc nienazwana-przestrzeń nazw, czyli
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
Mam nadzieję, że wyjaśnia, dlaczego unnamed-namespace
jest lepszy od static
.
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).
deprecated
uwaga została usunięta z najnowszego C ++ 0x FCD (n3225).
.cpp
to definiowanie klasy o tej samej nazwie.
Z tym wiąże się ciekawy problem:
Załóżmy, że używasz static
słowa kluczowego lub nienazwanego, namespace
aby uczynić jakąś funkcję wewnętrzną w module (jednostka tłumaczenia), ponieważ ta funkcja jest przeznaczona do użytku wewnętrznego przez moduł i nie jest dostępna poza nim. (Nienazwane elementy namespace
mają tę zaletę, że poza funkcjami definiują również dane i typy).
Z czasem plik źródłowy implementacji Twojego modułu się powiększa i chciałbyś podzielić go na kilka osobnych plików źródłowych, co pozwoliłoby na lepszą organizację kodu, szybsze znajdowanie definicji i samodzielną kompilację.
Ale teraz pojawia się problem: te funkcje nie mogą już dotyczyć static
modułu, ponieważ static
tak naprawdę nie odnoszą się do modułu , ale do pliku źródłowego (jednostki tłumaczeniowej). Jesteś zmuszony uczynić je niedozwolonymi, static
aby umożliwić dostęp do nich z innych części (plików obiektowych) tego modułu. Ale oznacza to 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 Twoim pierwotnym zamiarem.
Bez nazwy też namespace
nie rozwiązałoby tego 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 wspaniale, gdyby można było określić, że pewne namespace
jest private
, że to, co określa się w nim, ma być używany wewnętrznie przez moduł do której należy. Ale oczywiście C ++ nie ma takiej koncepcji jak „moduły”, tylko „jednostki tłumaczeniowe”, które są ściśle powiązane z plikami źródłowymi.
static
działają tylko .