2012-07-02 21 views
6

Byłem niedawno czytania Stroustrups C++ Programming Language iw sekcji o polaczenie w rozdziale 9 natknąłem się na następujący akapit:Dlaczego powinniśmy używać tylko "static" w klasie lub funkcji (C++)?

„w C i starszych ++ programów C, statyczne słowo kluczowe (myląco) używane oznacza "użyj wewnętrznego powiązania" .Nie używaj statycznych z wyjątkiem funkcji wewnętrznych i klas. "

Problem polega na tym, że dalsze czytanie, autor nie wyjaśnił, dlaczego jest to zła praktyka. Od czasu do czasu używam funkcji statycznych w moim kodzie, zazwyczaj dla prostych obliczeń, które nie są potrzebne poza jednostką kompilacji, ale nigdy nie zdawałem sobie sprawy, że to jest źle widziane i nie jest dla mnie oczywiste, dlaczego jest źle. Czy ktoś może rzucić na to światło dla mnie, proszę?

+2

Właściciel blisko głosowania: jak to nie jest konstruktywne? –

+0

może to pomoc: http://stackoverflow.com/questions/1358400/what-is-external-linkage-and-internal-linkage-in-c –

Odpowiedz

5

Myślę, że pomysł nie polega na marszczeniu brwi na wewnętrznym sprzężeniu, ale aby uniknąć pomyłki z nowym znaczeniem static: static ma zbyt wiele znaczeń (deklarowanie rzeczy z wewnętrznym powiązaniem, definiowanie zmiennych lokalnych z czasem przechowywania statycznego, oznaczanie nieinstancji członków klas), więc unikanie jednego z mniej intuicyjnych jest dobrą rzeczą.

Z tego powodu standard C++ 98 zapewnia inny sposób zadeklarowania elementów z wewnętrznym powiązaniem: unnamed namespaces i wycofuje static "podczas deklarowania obiektów w zakresie przestrzeni nazw".

Standard C++ 11 usunął to wycofanie (a także zmienił w jakiś sposób semantyczną nienazwaną przestrzeń nazw, tak naprawdę nie wymagającą wewnętrznego powiązania), więc jest to teraz kwestia stylu.

+3

Nienazwane przestrzenie nazw _nie_ powodują, że ich zawartość ma wewnętrzne powiązania. Umieszczają go w przestrzeni nazw, której nie można nazwać poza jednostką tłumaczeniową, ale powiązanie jest nadal zewnętrzne, co ma wpływ na szablony. –

+0

@JamesKanze: Czy nadal ma znaczenie dla szablonów, czy też odnosi się do języka sprzed 2011 r.? –

+0

@JamesKanze: co to za różnica w szablonach? –

4

Ponieważ w C++ należy preferować anonimowe przestrzenie nazw, które w zasadzie oferują tę samą funkcjonalność.

myślę static w tym kontekście jest mile widziana, ponieważ podwójnych znaczeń, a fakt, że te dwa znaczenia są zupełnie odwrotnie - jeśli Wewnątrz class lub struct reprezentuje stan globalnej, podczas gdy na zewnątrz daje wewnętrzną linkeage i dostarcza kopię zmiennej lub metody do każdej jednostki tłumaczeniowej.

Moreso, static może mieć zastosowanie tylko do funkcji i zmiennych, podczas gdy wewnątrz anonimowej przestrzeni nazw można mieć deklaracje typu.

namespace //OK 
{ 
    class X {}; 
} 

static class X //syntactically correct, but does nothing 
{ 
}; 

Należy zauważyć, że średnia uzna zastosowanie static określić linkeage jak przestarzałe.

+0

Istnieje również fakt, że nie można używać "statycznych" obiektów lub funkcji utworzyć instancję szablonu. (I jest nieco sprzeczny fakt, że zmienna "const" w obszarze nazw jest domyślnie "statyczna".) –

+1

C++ 11 usunęło to wycofanie, a także głupie ograniczenie dla argumentów szablonu. Nie ma już żadnego konkretnego powodu, aby preferować jeden nad drugim. –

Powiązane problemy