2014-09-08 18 views
19

Czy ktoś mógłby mi powiedzieć, jaki jest cel deklarowania funkcji statycznych poza zajęciami? Jaka jest różnica między tymi 2? Czy są jakieś korzyści z używania statycznego w tej sytuacji?Funkcje statyczne poza klasami

static void someRandomFunction(); 

int main() 
{ 
    someRandomFunction(); 
    return 0; 
} 

i

void someRandomFunction(); 

int main() 
{ 
    someRandomFunction(); 
    return 0; 
} 

Odpowiedz

23

W zakresie przestrzeni nazw static podaje nazwę wewnętrzny łącznik, co oznacza, że ​​jest dostępny tylko w obrębie jednostki tłumaczeniowej zawierającej definicję. Bez static ma on zewnętrzny interfejs i jest dostępny w dowolnej jednostce tłumaczeniowej.

Używanie static (lub alternatywnie nienazwanej przestrzeni nazw) podczas pisania funkcji przeznaczonej wyłącznie do użytku w tym urządzeniu; wewnętrzne powiązanie oznacza, że ​​inne jednostki mogą definiować różne funkcje o tej samej nazwie bez powodowania konfliktów nazw.

Funkcje niestatyczne (i ogólnie nazwy globalne) są lepiej zadeklarowane w nagłówku, aby upewnić się, że każda jednostka tłumaczeniowa, która ich używa, otrzymuje tę samą deklarację.

5

static słów kluczowych globalnych funkcji lub zmiennych ogranicza widoczność i powiązania zakres funkcji lub zmiennej do aktualnego translation unit.

Oznacza to, że dla funkcji można ją wywołać tylko z bieżącego pliku źródłowego, a nie z innych plików źródłowych.

1

static mówi, że kompilator nie dodaje funkcji do tabeli symboli dla pliku obiektu. Oznacza to, że link nie może znaleźć funkcji, co z kolei oznacza, że ​​możesz użyć tej funkcji bezpośrednio w bieżącej jednostce kompilacji. Można jednak wywoływać funkcje statyczne z innej kompilacji, jeśli odbywa się to za pomocą wskaźnika funkcji.

1
static void someRandomFunction(); 

To musi być używane w tej samej jednostce kompilacji (plik źródłowy) i poza tym kompilatorem, niedostępne do użytku. Natomiast jeśli masz

void someRandomFunction(); 

z jednej definicji transmisji poprzez program, funkcja może być używana przez dowolną jednostkę kompilacji globalnie w całym programie

1

metody statyczne i funkcje statyczne są zupełnie różne rzeczy.

Metody statyczne są metodami klasy zamiast instancji (która już wiesz, jak się wydaje).

Z drugiej strony funkcje statyczne są dostępne tylko w module, w którym są zdefiniowane. Nie są one eksportowane i nie można ich umieścić w pliku nagłówkowym i używać w innym pliku c. W ten sposób możesz napisać różne funkcje o tej samej nazwie, a także kompilator może zoptymalizować twój kod dokładniej poprzez zaznaczenie funkcji, wiedząc, że żaden inny plik nie jest od niej zależny.

5

Funkcja static pozostaje widoczna tylko w zasięgu pliku. To jest funkcja C.
Zalecany sposób to zrobić w C++ używa nazw anonimowych, jak w:

namespace // no name, i.e. anonymous 
{ 
    static void someRandomFunction(); 
} 

int main() 
{ 
    someRandomFunction(); // visible only within this file. 
    return 0; 
} 

pamiętać, że funkcja ciało musi również zostać uznane gdzieś w samego pliku ponieważ łącznik nie będzie spróbuj go znaleźć w innych (zewnętrznych) jednostkach tłumaczeniowych.
Tak więc static void someRandomFunction(); jest naprawdę przednim zgłoszeniem dla funkcji zdefiniowanej gdzie indziej w tym samym pliku (to jest w tej samej jednostce tłumaczeniowej).

Jeśli funkcja jest rzeczywiście wywoływana, pojawi się błąd łączenia, chyba że treść funkcji jest zdefiniowana w tym samym pliku.

+0

Czy są jakieś problemy, jeśli użytkownik korzysta z nieanonimowego obszaru nazw w tym przykładzie (zachowując "static")? – Hydren

+1

Nie. "Statyczny" zachowuje funkcję w zakresie plików tylko z wewnętrznym łączeniem. Wyszukiwanie nazw w pliku nadal będzie się odbywać zgodnie ze zwykłymi regułami przestrzeni nazw. Ale, jak zwykle, uważaj na naruszenia ODR w tym przypadku. –

Powiązane problemy