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.
- 1. Mieszanie plików i pętli
- 2. Zewnętrzne elementy zewnętrzne w węźle i przeglądarce
- 3. Mieszanie HTML5 Canvas i Python
- 4. Mieszanie iOS UIKit i Cocos2d
- 5. Mieszanie Typeahead.js i Bootstrap 3
- 6. Mieszanie przyciski radiowe i text_field
- 7. Mieszanie C++ i Objective C
- 8. Mieszanie bezpiecznych i niezabezpieczonych kanałów
- 9. Mieszanie plików C i Assembly
- 10. Różnica między const i const lotnej
- 11. const i STL pojemniki
- 12. rozmiar tablicy i const
- 13. C++: funkcje zewnętrzne i inline
- 14. Zamień monady wewnętrzne i zewnętrzne
- 15. Angular JS i biblioteki zewnętrzne
- 16. Studio Android i urządzenie zewnętrzne
- 17. Powszechne mieszanie
- 18. Mieszanie dynamicznych i statycznych pozycji menu XAML
- 19. Mieszanie AspectJ i Scala w projekcie Eclipse
- 20. Mieszanie build.sbt z projektu/Build.scala i agreguje
- 21. Mieszanie dopasowywania wzorców i curry w OCaml
- 22. Mieszanie cordova i natywne działania w Androidzie
- 23. Mieszanie xml i java config ze sprężyną
- 24. Mieszanie C i C++ z CMAKE
- 25. Mieszanie zakresów i stowarzyszenia w Phoenix/ekto
- 26. Mieszanie metod rozszerzeń, generycznych i wyrażeń lambda
- 27. Mieszanie polimerów 1.0 i Angular 1.x
- 28. Mieszanie proxy JDK i CGLIB na wiosnę
- 29. Możliwe mieszanie skryptów powłoki i python?
- 30. Mieszanie log4j 1.x i log4j 2
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