2010-02-03 14 views
37

Czy mogę łączyć zewnętrzne i const, jako extern const? Jeśli tak, to czy kwalifikator const wyznacza tylko w zakresie, w którym został zadeklarowany, czy powinien dokładnie odpowiadać deklaracji jednostki translacyjnej, w której została zadeklarowana? To znaczy. mogę zadeklarować extern const int i;, nawet jeśli rzeczywiste i nie jest const i na odwrót?Mieszanie zewnętrzne i const

+3

To pytanie nie dotyczy bezpośrednio Ciebie, ale zawiera wszystkie wymagane informacje: http://stackoverflow.com/questions/2151831/non-integral-constants/2151876#2151876 – GManNickG

+0

Pozwolę sobie wspomnieć o różnicy w linkowaniu tutaj : Użycie 'extern' z' const' wyłącza zwijanie składni i wymusza na kompilatorze przydzielenie pamięci dla stałej, co nie miało miejsca w innym przypadku, w której dokona podstawienia inplace (po złożeniu, jeśli to możliwe). [stąd nie jest to zalecane i zdecydowałem się go nie używać :)] – legends2k

+0

jeśli jest to stała, dlaczego kompilator wyłączyłby stałe składanie w przypadku wersji zewnętrznej? – Jimm

Odpowiedz

33
  • Tak, można ich używać razem. .
  • I tak, należy go dokładnie dopasować deklarację w jednostce tłumaczeniowej to faktycznie zadeklarowanej ile oczywiście uczestniczą w Underhanded C Programming Contest :-)

Zazwyczaj wzór jest:

  • file.h:
    extern const int a_global_var;
  • file.c:
    #include "file.h"
    const int a_global_var = /* some const expression */;

Edytuj: Dodany komentarz legends2k. Dzięki.

+0

Czy chodziło Ci o const 'int a_global_var = ;'? – legends2k

+1

Nie mogłem skorzystać z zalet extern const, a następnie przyszło mi do głowy, że zaoszczędzą one czas kompilacji przy zmianie stałych. Dzięki – doron

+22

Um, ponieważ 'const's są niejawnie' statyczne', potrzebujesz 'extern' nawet w definicji' a_global_var' (w * file.c *). Bez tego wszystko, co zawiera * file.h *, nie będzie łączyło, ponieważ szuka "const int a_global_var" z zewnętrznym powiązaniem. –

0

Tak, można ich używać razem.

Jeśli zadeklarujesz "extern const int i", to i jest const w pełnym zakresie. Niemożliwe jest przedefiniowanie go jako niestałego. Oczywiście możesz ominąć flagę const, odrzucając ją (używając const_cast).

1

Możesz ich używać razem i możesz robić różne rzeczy, które ignorują słowo kluczowe const, ponieważ to wszystko; słowo kluczowe. Mówi kompilatorowi, że nie zmienisz zmiennej, która z kolei pozwala kompilatorowi wykonywać użyteczne optomizacje i powstrzymuje cię od zmieniania rzeczy, których nie chciałeś.

Possibility.com ma a decent article z nieco więcej tłem.

5

Możesz używać ich razem. Ale musisz być konsekwentny w używaniu const, ponieważ gdy C++ tworzy dekorację nazwy, stała jest zawarta w informacji o typie, która jest używana do dekoracji nazw symboli. więc extern const int i będzie odnosić się do innej zmiennej niż extern int i

O ile nie użyto zewnętrznego "C" {}. C dekoracja nazwy nie zwraca uwagi na const.