Wyższość nienazwanej przestrzeni nazw nad statyczną?
W Jaki Sposób nienazwane przestrzenie nazw są lepsze od słowa kluczowego static
?
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).
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.
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 namespace
s 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.
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