2011-01-18 18 views
20

Czy istnieje możliwość oznaczania zmiennej jako static, gdy leży ona w zakresie globalnym pliku .cpp, a nie w funkcji?Używanie zmiennych statycznych i funkcji w zakresie globalnym

Czy możesz użyć słowa kluczowego static również dla funkcji? Jeśli tak, jakie są ich zastosowania?

+2

Brzmi jak praca domowa –

+27

Brzmi jak ktoś nazywający cokolwiek pracami domowymi –

Odpowiedz

14

W tym przypadku słowo kluczowe oznacza, że ​​funkcja lub zmienna może być używana tylko przez kod w tym samym pliku cpp. Powiązany symbol nie zostanie wyeksportowany i nie będzie możliwy do użycia przez inne moduły.

To jest dobra praktyka, aby unikać zderzenia nazw w dużym oprogramowaniu, gdy wiesz, że funkcje globalne lub zmienne nie są potrzebne w innych modułach.

+11

W C++ należy używać nienazwanych przestrzeni nazw. –

16

Tak, jeśli chcesz zadeklarować zmienną zakresu pliku, wymagane jest słowo kluczowe static. static zmiennych zadeklarowanych w jednej jednostce tłumaczeniowej nie można odnieść do innej jednostki tłumaczeniowej.


Nawiasem mówiąc, użycie słowa kluczowego static jest przestarzałe w C++ 03.

Sekcja $ 7.3.1.1/2 z C++ Standard (2003) czytamy,

Użycie hasła statycznego jest przestarzałe podczas deklarowania obiektów w zakresie przestrzeni nazw; Nienazwany obszar nazw zapewnia lepszą alternatywę .

C++ preferuje nienazwany nazw nad static hasła. Zobaczyć ten wątek:

Superiority of unnamed namespace over static?

+6

A najnowszy szkic C++ 0x go anuluje. –

+2

@Fred: To interesujące! – Nawaz

+0

@Fred: zabawne, zmieniło się między n3092 i n3225, czy wiesz, co motywowało tę zmianę? –

1

Biorąc jako przykład -

// At global scope 
int globalVar; // Equivalent to static int globalVar; 
       // They share the same scope 
       // Static variables are guaranteed to be initialized to zero even though 
       // you don't explicitly initialize them. 


// At function/local scope 

void foo() 
{ 
    static int staticVar ; // staticVar retains it's value during various function 
          // function calls to foo();     
} 

Oboje przestają istnieć tylko wtedy, gdy program kończy/wyjście.

+0

Ale czy zmienna statyczna związana z zasięgiem funkcji zostanie zainicjalizowana w czasie wykonywania lub tylko wtedy, gdy zostanie uruchomiona funkcja o zakresie, w tym przypadku foo()? –

+0

@Mahesh Czy globalVar nie jest statyczna, jeśli domyślnie nie określasz statycznego? .Myślę, że można łatwo rozszerzyć niestatyczne zmienne globalne. – starkk92

Powiązane problemy