2016-09-01 20 views

Odpowiedz

3

Odpowiedź brzmi: nie. Według http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (projekt C99) i http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (projekt C11):

6.2.4 Przechowywanie trwania obiektów

1 Obiekt ma czas trwania przechowywania który określa jej żywotność.

Funkcje nie są obiektami, więc nie mają pamięci.

6.2.2 wiązań identyfikatorów

3 Jeśli deklaracja identyfikator pliku zakres dla obiektu lub funkcji zawiera magazynowania klasy specyfikator static identyfikator ma wewnętrzny łącznik.

Oznacza to, że static zastosowany do funkcji wpływa na jej powiązanie (nie ma pamięci, do której mógłby się zastosować).

3

Standard C nie formalnie definiuje znaczenia klasy przechowywania.

To nie definiuje, czym jest "magazynowanie klasy specifier" --- to jest to jeden z kluczowych typedef, extern, static, _Thread_local, auto i register.

Funkcje można deklarować ze specyfikatorami klasy pamięci extern lub static.

Standardowo robi obiektów wzmianka o „klasie pamięci” w kilku miejscach, na przykład

Jeśli obiekt tablica ma zarejestrować klasę pamięci, zachowanie jest niezdefiniowane

ale nigdy nie jest zdefiniowana jaka jest klasa pamięci obiektu. Można zasadnie założyć, że jest to słowo kluczowe specyfikatora klasy pamięci, które pojawia się w jednej z deklaracji, ale pozostaje niejasne, co się dzieje, jeśli niektóre deklaracje tego samego obiektu mają specyfikator klasy pamięci, a inne nie. Nigdy też nie jest zdefiniowana klasa pamięci obiektu, który nie ma deklaracji ze specyfikatorem klasy pamięci.

Wydaje się, że należy unikać mówienia o klasach przechowywania obiektów lub funkcji w ogóle, a zamiast używać podobnych pojęć Czas składowania i powiązania które są precyzyjnie określone przez normę. W razie potrzeby użyj zwrotów takich jak "specyfikator klasy pamięci X pojawia się w deklaracji", ale nie "obiekt/funkcja ma klasę pamięci X".

+0

Podoba mi się Twoja odpowiedź ... –

+0

Moja interpretacja: "ma klasę pamięci rejestru" oznacza "została zadeklarowana ze specyfikatorem klasy pamięci rejestru", inne wystąpienia "posiadające klasę pamięci" w standardzie są niedbałymi sformułowaniami, które powinny zostać poprawione, aby nie wspominać "klasy pamięci", ale zamiar jest jasny w każdym przypadku –

Powiązane problemy