Znalazłem komentarz użytkownika R .. :
C i C ++ nie są tym samym językiem. W szczególności C
const
nie ma nic wspólnego z C ++const
.
Wiem, że jedną różnicą między const
kwalifikatorem w C i const
kwalifikatorem w C ++ jest jego domyślne połączenie.
Obiekt zadeklarowany w zakresie przestrzeni nazw z const
kwalifikatorem w C ++ ma wewnętrzne powiązanie, podczas gdy w C obiekt z const
kwalifikatorem zadeklarowanym w zakresie globalnym (bez wcześniejszego static
kwalifikatora const
) ma zewnętrzne powiązanie.
Ale jak inaczej różnią się one między językami C i C ++? Myślałem, że oba mają taką samą koncepcję i cel w obu językach.
Moje pytanie:
- Jaka jest różnica między kwalifikatorem const w C a kwalifikatorem const w C ++?
Odpowiedzi na pytanie: Czym różni się „const” w C i C ++? nie wskazuj dokładnej różnicy między językami C i C ++ w kontekście const
kwalifikatora. Tylko to, czego nie możesz zrobić lub możesz zrobić w określonym języku.
źródło
const
nie ma nic wspólnego z łączeniem. Możesz miećstatic const
zakres pliku i ma wewnętrzne powiązanie,const
samo w obu językach.Odpowiedzi:
Najważniejszą różnicą jest to, że w C ++
const
zmienna jest stałym wyrażeniem (nawet przed wprowadzeniem C ++ 11constexpr
), aleconst
zmienna w C nie jest.Oznacza to, że C ++ pozwala robić takie rzeczy,
const size_t n = 1; static int array[n];
ale C na to nie pozwala, prawdopodobnie z powodów historycznych.W C ++
const
odgrywa rolę w określaniu powiązania. Różni się to między wersjami C ++. Według cppreference.com (moje podkreślenie):Podczas gdy w C
const
nie odgrywa żadnej roli w określaniu powiązania - znaczenie mają jedynie zakres deklaracji i specyfikatory klasy pamięci.W C ++ możesz
const
zakwalifikować funkcje składowe. Nie jest to możliwe w C, ponieważ nie ma obsługi składni dla funkcji składowych.C umożliwia
const
deklarowanie zmiennych kwalifikowanych bez inicjatora. W C możemy pisaćconst int x;
bez inicjatorów, ale C ++ na to nie pozwala. Na pierwszy rzut oka może to wydawać się bezsensownym błędem językowym w C, ale uzasadnieniem jest to, że komputery mają rejestry sprzętowe tylko do odczytu z wartościami ustawionymi przez sprzęt, a nie oprogramowanie. Oznacza to, że C nadal nadaje się do programowania sprzętowego.źródło
const size_t n = 1; static int array[n];
działa tylko wtedy, gdy kompilator widzi definicjęn
i wykonuje stałą propagację.extern const size_t n; static int array[n];
nie działauint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);
...volatile
zakwalifikować wskaźnik.volatile
... Reszta zależy. Debugery, które miałem ręcznie w tych przypadkach, również mogły łatwo rozwiązać*x
. Z drugiej strony, jeśli rejestry są odwzorowane na jakiś obszar pamięci, a kompilator nie obsługuje bezpośredniego umieszczania zmiennych w określonych lokalizacjach pamięci (widziałem oba), uzyskanie zmiennej w określonej lokalizacji pamięci może czasami być nieco nieporządne (konieczność zakrycia tego w pliku mapy ...). Ostatecznie nie dbam o to, aby zmienna znajdowała się we właściwym miejscu lub wskaźniku, o ile mogę wykonać zadanie, do którego mnie przydzielono;)Od cppreference.com :
Poza tym
const
ma taką samą semantykę w nagłówkach C i C ++, a nagłówki Cconst
są często kompilowane jako nagłówki C ++ z warunkiem"extern C"
.źródło
static const x;
w zakresie plików w C ma wewnętrzne powiązanie. Powiązanie zmiennej C zależy od zakresu, w którym jest deklarowana, a także od obecności / braku specyfikatorów klasy pamięci.const
a inne kwalifikatory typu wcale nie biorą w tym udziału.static const x;
w zakresie plików w C znajduje się zewnętrzny link.int const x = 1
w C ma powiązanie zewnętrzne . Dlatego należystatic
zmienić powiązanie na wewnętrzne. Cytat jest dla mnie dość jasny, w przeciwieństwie do twoich komentarzy.