В чем разница между квалификатором const в C и квалификатором const в C ++? - PullRequest
9 голосов
/ 07 февраля 2020

Я нашел комментарий пользователя R .. :

C и C ++ не являются тем же языком. В частности, C const не имеет ничего общего с C ++ const.

Я знаю, что есть одно различие между классификатором const в C и квалификатором const в C ++ это стандартная связь.

Объект, объявленный в области имен с квалификатором const в C ++, имеет внутреннюю связь, тогда как в C объект с квалификатором const объявлен в глобальной области (без Квалификатор static до const) имеет внешнюю связь.

Но как иначе они оба отличаются между языками C и C ++? Я думал, что у обоих одинаковые понятия и цели на обоих языках.

Мой вопрос:

  • В чем разница между квалификатором const в C и const классификатор в C ++?

Ответы на Чем "const" отличается в C и C ++? не указывают на точное различие между языками C и C ++ в контексте квалификатора const. Только то, что вы не можете или не можете сделать с этим на определенном языке.

Ответы [ 2 ]

11 голосов
/ 07 февраля 2020
  • Наиболее важным отличием является то, что в C ++ переменная const является постоянным выражением (даже до введения C ++ 11 constexpr), но переменная const в C не является.

    Это означает, что C ++ позволяет вам делать такие вещи, как const size_t n = 1; static int array[n];, но C не позволяет этого, предположительно по историческим причинам.

  • В C ++, const играет роль в определении связи. Это отличается между версиями C ++. Согласно cppreference.com (выделение мое):

    Любое из следующих имен, объявленных в области имен, имеет внутреннюю связь:


    • энергонезависимые не шаблонные (начиная с C ++ 14) не встроенные (начиная с C ++ 17) не экспортируемые (начиная с C ++ 20) переменные с константной квалификацией (включая constexpr), которые не ' t объявлен extern и ранее не был объявлен как имеющий внешнюю связь;

    Принимая во внимание, что в C, const вообще не участвует в определении связи - имеют значение только спецификаторы области объявления и класса хранения.

  • В C ++ вы можете const квалифицировать функции-члены. Это невозможно в C, поскольку у него нет поддержки синтаксиса для функций-членов.

  • C позволяет объявлять const -качественные переменные без инициализатора. В C мы можем написать const int x; без инициализаторов, но C ++ не позволяет этого. На первый взгляд, это может показаться бессмысленной языковой ошибкой в ​​C, но логическое обоснование состоит в том, что компьютеры имеют аппаратные регистры только для чтения со значениями, установленными аппаратными средствами, а не программными. Это означает, что C остается пригодным для аппаратного программирования.

0 голосов
/ 07 февраля 2020

С cppreference.com :

Квалификатор const, используемый в объявлении нелокального энергонезависимого не-шаблона (начиная с C ++ 14) не встроенная (начиная с C ++ 17) переменная, которая не объявлена ​​extern, придает ей внутреннюю связь. Это отличается от C, где const переменные области файла имеют внешнюю связь.

Кроме этого const имеет такую ​​же семантику в C и C ++ и Заголовки C с const часто компилируются как заголовки C ++ с условным "extern C".

...