Podczas sprawdzania mojego kodu tutajconst
pojawił się problem użycia słowa kluczowego. Rozumiem, że służy do implementacji zachowania tylko do odczytu w zmiennych.
Jestem zdezorientowany, jakie są różne sytuacje, w których może to być przydatne.
- Czy należy go używać ze względu na przejrzystość prototypów funkcji?
- Czy powinien być stosowany jako środek bezpieczeństwa podczas tworzenia kodu?
- Czy należy go stosować w zakresie różnych funkcji do deklarowania stałych czasu wykonywania?
- Czy należy go w ogóle stosować?
Te pytania są tylko przykładami zamieszania, przed którym stoję. Ogólne zamieszanie jest takie
- Kiedy
const
słowo kluczowe powinno być używane w programowaniu C? - Jakie są różne rodzaje korzyści, które można uzyskać, używając tego słowa kluczowego w C?
- Czy są jakieś wady używania
const
słowa kluczowego?
Wskazano, że pytanie to może być zbyt szerokie ze względu na wszystkie te pytania w szczegółach mojego pytania. Chciałem tylko wyjaśnić, że te pytania mają na celu wyjaśnienie zamieszania związanego z głównym pytaniem.
Kiedy i do jakich celów należy używać słowa kluczowego const w C dla zmiennych?
Można go również sformułować jako
Właściwe użycie
const
słowa kluczowego w C` z zaletami i wadami tego samego.
c
readability
patterns-and-practices
const
Aseem Bansal
źródło
źródło
Specific issues with software development
. Jestem dość specyficzny.specific issue
. Właściwe użycieconst
słowa kluczowego w C` z zaletami i wadami tego samego.Odpowiedzi:
Podczas przeglądania kodu stosuję następujące zasady:
Zawsze używaj
const
parametrów funkcji przekazywanych przez odniesienie, gdy funkcja nie modyfikuje (ani nie zwalnia) wskazanych danych.Zawsze używaj
const
dla stałych, które w innym przypadku mogłyby zostać zdefiniowane za pomocą #define lub enum. W rezultacie kompilator może zlokalizować dane w pamięci tylko do odczytu (ROM) (chociaż linker jest często lepszym narzędziem do tego celu w systemach osadzonych).Nigdy nie używaj const w prototypie funkcji dla parametru przekazywanego przez wartość . Nie ma to znaczenia i dlatego jest po prostu „hałasem”.
W stosownych przypadkach użyj
const volatile
w miejscach, których program nie może zmienić, ale może się zmienić. Rejestry sprzętowe są tutaj typowym przypadkiem użycia, na przykład rejestr stanu odzwierciedlający stan urządzenia:Inne zastosowania są opcjonalne. Na przykład parametry funkcji w ramach implementacji funkcji można oznaczyć jako const.
lub funkcja zwraca wartości lub obliczenia, które są uzyskiwane, a następnie nigdy się nie zmieniają:
Te zastosowania po
const
prostu wskazują, że nie zmienisz zmiennej; nie zmieniają sposobu ani miejsca przechowywania zmiennej. Kompilator może oczywiście zorientować się, że zmienna się nie zmienia, ale dodającconst
pozwalasz na wymuszenie tego. Może to pomóc czytelnikowi i zwiększyć bezpieczeństwo (chociaż jeśli twoje funkcje są wystarczająco duże lub skomplikowane, że robi to wielką różnicę, prawdopodobnie masz inne problemy). Edytuj - np. gęsto zakodowana funkcja 200-liniowa z zagnieżdżonymi pętlami i wieloma długimi lub podobnymi nazwami zmiennych, wiedząc, że niektóre zmienne nigdy się nie zmieniają, może znacznie ułatwić zrozumienie. Takie funkcje zostały źle zaprojektowane lub utrzymane.Problemy z
const
. Prawdopodobnie usłyszysz termin „zatrucie ciągłe”. Dzieje się tak, gdy dodanieconst
do parametru funkcji powoduje propagację „stałości”.Edycja - zatrucie const: na przykład w funkcji:
jeśli zmienimy
str
naconst
, musimy wtedy upewnić się, żefuction_b
również trwaconst
. I tak dalej, jeślifunction_b
przekaże tostr
dalejfunction_c
, itd. Jak można sobie wyobrazić, może to być bolesne, jeśli rozprzestrzeni się na wiele oddzielnych plików / modułów. Jeśli propaguje się do funkcji, której nie można zmienić (np. Biblioteki systemowej), konieczne jest rzutowanie. Więc przelewanieconst
się w istniejącym kodzie może być przyczyną problemów. Jednak w nowym kodzie najlepiej jestconst
konsekwentnie kwalifikować się w stosownych przypadkach.Bardziej podstępnym problemem
const
jest to, że nie było w oryginalnym języku. Jako dodatek nie do końca pasuje. Na początek ma dwa znaczenia (jak w powyższych regułach, co oznacza „nie zamierzam tego zmieniać” i „tego nie można zmienić”). Ale co więcej, może być niebezpieczne. Na przykład skompiluj i uruchom ten kod i (w zależności od kompilatora / opcji) może się on zawiesić po uruchomieniu:strchr
zwracachar*
nie aconst char*
. Jak sama rozmowa jest parametrconst
musi rzucać parametr wezwanie dochar*
. I w tym przypadku odrzuca to właściwość pamięci tylko do odczytu. Edycja: - dotyczy to ogólnie zmiennych w pamięci tylko do odczytu. Przez „ROM” rozumiem nie tylko fizyczną pamięć ROM, ale każdą pamięć chronioną przed zapisem, tak jak dzieje się w przypadku sekcji kodu programów działających na typowym systemie operacyjnym.Wiele standardowych funkcji bibliotecznych zachowuje się w ten sam sposób, więc uważaj: gdy masz prawdziwe stałe (tj. Przechowywane w pamięci ROM), musisz bardzo uważać, aby nie stracić ich stałej.
źródło
const volatile
zmiennej jest całkowicie poprawne .const
zmienna jest naprawdę tylko do odczytu:const
mówi „Tego nie można modyfikować”. Zconst volatile
drugiej strony jest napisane: „Nie można tego zmienić, ale może się zmienić”. Dodam wzmiankę o składnikach lotnych do mojej odpowiedzi.const
zmienną za pomocąconst
wskaźnika” (częste pytanie na SO i na każdym innym forum C !). Ogólnie jednak podoba mi się ta odpowiedź :)const
deklaruje zarówno dane tylko do odczytu, jak i widoki danych tylko do odczytu - różnica polega na tym, że „nie można tego zmienić” w porównaniu z „nie można tego zmienić”.Ogólnie w dowolnym języku programowania zaleca się jego użycie
const
lub równoważny modyfikator od tego czasuźródło
Tak, to w zasadzie odpowiedź TheLQ.
Jest to środek bezpieczeństwa dla programisty, więc nie modyfikujesz zmiennej i nie wywołujesz funkcji, które mogą ją modyfikować. W tablicy lub strukturze specyfikator const wskazuje, że wartości ich zawartości nie zostaną zmodyfikowane, a nawet kompilator nie pozwoli na to. Jednak nadal możesz łatwo zmienić wartość zmiennej za pomocą rzutowania.
W tym, co zwykle widzę, służy głównie do dodawania stałych wartości w kodzie i do wskazania, że tablica lub struktura nie zostaną zmodyfikowane, jeśli wywołasz określoną funkcję. Ta ostatnia część jest ważna, ponieważ wywołując funkcję, która Modyfikuje tablicę lub strukturę, możesz chcieć zachować oryginalną wersję, więc utworzysz kopię zmiennej, a następnie przekażesz ją do funkcji. Jeśli tak nie jest, oczywiście nie potrzebujesz kopii, więc możesz na przykład zmienić,
do
i nie otrzymuję narzutu.
Wystarczy dodać, że C ma określone reguły ze specyfikatorem const. Na przykład,
to nie to samo co
Pierwszy kod nie pozwala na modyfikację. W drugim przypadku wskaźnik jest stały, ale jego zawartość nie jest, więc kompilator pozwoli ci powiedzieć
* a = 3;
bez błędu kompilatora, ale nie możesz uczynića
odniesienia do innej rzeczy.źródło
Zgodnie z oświadczeniami TheLQ:
Podczas pracy z zespołem programistów deklarowanie
const
jest dobrym sposobem na wskazanie, że wymienionej zmiennej nie należy modyfikować, lub po prostu dla przypomnienia sobie w dużych projektach. Jest to przydatne w tym sensie i może uratować wiele bólów głowy.źródło