Wyższość nienazwanej przestrzeni nazw nad statyczną?

W Jaki Sposób nienazwane przestrzenie nazw są lepsze od słowa kluczowego static?

Author: Michael Graczyk, 2010-12-12

3 answers

W zasadzie odnosisz się do sekcji $7.3.1.1/2 ze standardu C++,

Użycie słowa kluczowego static jest przestarzałe przy deklarowaniu obiektów w namespace scope; the unnamed-namespace provides a superior alternatywa.

Nienazwana przestrzeń nazw jest lepsza od statycznego słowa kluczowego, przede wszystkim dlatego, że słowo kluczowe static dotyczy tylko deklaracji i funkcji zmiennych, a nie zdefiniowanych przez użytkownika typy .

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

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

Ale ten kod jest nieprawidłowy:

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

Więc rozwiązaniem jest, nienazwana-przestrzeń nazw, czyli to,

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

Mam nadzieję, że to wyjaśnia, dlaczego unnamed-namespace jest lepsze od static.

Należy również pamiętać, że użycie słowa kluczowego statycznego jest przestarzałe podczas deklarowania obiektów w obszarze przestrzeni nazw (zgodnie ze standardem).

 108
Author: Nawaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-16 07:17:58

Standard C++ odczytuje w sekcji 7.3.1.1 nienazwane przestrzenie nazw, paragraf 2:

Użycie słowa kluczowego static jest przestarzałe przy deklarowaniu obiektów w namespace scope, the unnamed-namespace zapewnia doskonałą alternatywę.

Static ma zastosowanie tylko do nazw obiektów, funkcji i anonimowych związków, a nie do typowania deklaracji.

 6
Author: Salgar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-12 16:10:16

Jest ciekawy problem z tym związany:

Załóżmy, że użyjesz słowa kluczowego static lub nienazwanego namespace, aby uczynić jakąś funkcję wewnętrzną w module (Jednostka tłumaczenia), ponieważ ta funkcja ma być używana wewnętrznie przez moduł i nie jest dostępna poza nim. (Nienazwane namespaces mają tę zaletę, że oprócz funkcji również definicje danych i typów są wewnętrzne).

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

Ale teraz masz problem: te funkcje nie mogą być już static do modułu, ponieważ static nie odnosi się do modułu, ale do pliku źródłowego (Jednostka tłumaczeń). Musisz uczynić je nie - static, aby umożliwić dostęp do nich z innych części (plików obiektowych) tego modułu. Ale to oznacza to również, że nie są one już ukryte/prywatne dla modułu: mając zewnętrzne połączenie, mogą być dostępne z innych modułów, co było Nie Twoim pierwotnym zamiarem.

Unnamed namespace również nie rozwiąże tego problemu, ponieważ jest on również zdefiniowany dla konkretnego pliku źródłowego (jednostki tłumaczenia) i nie może być dostępny z zewnątrz.

Byłoby wspaniale, gdyby można było określić, że niektóre namespace jest private, czyli to, co jest w nim zdefiniowane, ma być użyte wewnętrznie przez moduł, do którego należy. Ale oczywiście C++ nie ma takiego pojęcia jak "moduły", tylko "jednostki tłumaczeń", które są ściśle powiązane z plikami źródłowymi.

 5
Author: SasQ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-27 09:01:36