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
Odpowiedz
- 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.
Czy chodziło Ci o const 'int a_global_var =
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
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. –
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).
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.
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.
To pytanie nie dotyczy bezpośrednio Ciebie, ale zawiera wszystkie wymagane informacje: http://stackoverflow.com/questions/2151831/non-integral-constants/2151876#2151876 – GManNickG
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
jeśli jest to stała, dlaczego kompilator wyłączyłby stałe składanie w przypadku wersji zewnętrznej? – Jimm