Dlaczego nienazwana przestrzeń nazw jest "lepszą" alternatywą dla statycznej? [duplikat]

To pytanie ma już odpowiedź tutaj:

Sekcja $7.3.1.1/2 ze standardu C++ brzmi:

Użycie słowa kluczowego static jest przestarzałe przy deklarowaniu obiektów w zakres przestrzeni nazw; nienazwana-przestrzeń nazw zapewnia przełożonego alternatywa.

Nie rozumiem, dlaczego nienazwana przestrzeń nazw jest uważana za lepszą alternatywę? Jakie jest uzasadnienie? Od dawna wiem, co mówi standard, ale nigdy poważnie o tym nie myślałem, nawet gdy odpowiadałem na to pytanie: wyższość nienazwanej przestrzeni nazw nad statyczną?

Czy jest uważany za lepszy, ponieważ może być stosowany również do typów zdefiniowanych przez Użytkownika, jak opisałem w mojej odpowiedź ? A może jest jakiś inny powód, o którym Nie wiem? Pytam o to, szczególnie dlatego, że takie jest moje rozumowanie w mojej odpowiedzi, podczas gdy standard może mieć coś innego na myśli.

Author: Community, 2011-02-12

4 answers

  • Jak już wspomniałeś, przestrzeń nazw działa dla wszystkiego, nie tylko dla funkcji i obiektów.
  • Jak zauważył Greg, static oznacza już zbyt wiele rzeczy.
  • Przestrzenie nazw zapewniają jednolity i spójny sposób kontrolowania widoczności w globalnym zasięgu. Nie musisz używać różnych narzędzi do tego samego.
  • Podczas korzystania z anonimowej przestrzeni nazw, nazwa funkcji/obiektu zostanie odpowiednio zniekształcona, co pozwala zobaczyć coś w stylu " (anonymous namespace):: xyz "w tabeli symboli po odszyfrowaniu, a nie tylko" xyz " ze statycznym połączeniem.
  • Jak wspomniano w komentarzach poniżej, nie wolno używać rzeczy statycznych jako argumentów szablonu, podczas gdy w anonimowych przestrzeniach nazw jest to w porządku.
  • Więcej? Prawdopodobnie, ale nie mogę teraz myśleć o niczym innym.
 86
Author: Sergei Tachenov,
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
2011-02-12 14:12:03

Jednym z powodów może być to, że static ma już zbyt wiele znaczeń (mogę policzyć co najmniej trzy). Ponieważ anonimowa przestrzeń nazw może zawierać wszystko, w tym typy, wydaje się lepsza od rozwiązania static.

 9
Author: Greg Hewgill,
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
2011-02-12 09:10:18

Są dwa powody, dla których myślę:

  • static ma dwa różne znaczenia: w class scope oznacza współdzielony przez całą klasę, podczas gdy w file/function scope wpływa na widoczność / przechowywanie...
  • unnamed namespaces allow to declare new struct, class oraz typedef

Jedna uwaga, Komitet odwołał się do tego: {[0] } nie jest już oznaczony jako przestarzały w n3225.

 5
Author: Matthieu M.,
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
2011-02-12 18:08:06
 3
Author: Crazy Eddie,
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
2011-02-12 14:06:21