Я нашел комментарий пользователя 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
классификатора. Только то, что вы не можете или не можете сделать с этим на определенном языке.
источник
const
не имеет никакого отношения к связи. Вы можете иметьstatic const
в области видимости файла, и это имеет внутреннюю связь,const
делает то же самое на обоих языках.Ответы:
Наиболее важным отличием является то, что в C ++
const
переменная является константным выражением (даже до введения C ++ 11constexpr
), аconst
переменная в C - нет.Это означает, что C ++ позволяет вам делать подобные вещи,
const size_t n = 1; static int array[n];
но C не допускает этого, предположительно по историческим причинам.В C ++
const
играет роль в определении связи. Это отличается между версиями C ++. По данным cppreference.com (выделено мое):Принимая во внимание, что в C
const
не играет никакой роли в определении связи вообще - имеют значение только спецификаторы области объявления и класса хранения.В C ++ вы можете
const
квалифицировать функции-члены. Это невозможно в C, так как не имеет синтаксической поддержки функций-членов.C позволяет
const
объявлять -качественные переменные без инициализатора. В C мы можем писатьconst int x;
без инициализаторов, но C ++ не позволяет этого. На первый взгляд это может показаться бессмысленной языковой ошибкой в C, но логическое обоснование состоит в том, что компьютеры имеют аппаратные регистры только для чтения со значениями, установленными аппаратными средствами, а не программными. Это означает, что C остается подходящим для аппаратного программирования.источник
const size_t n = 1; static int array[n];
работает , только если компилятор может видеть определениеn
и выполнять постоянное распространение.extern const size_t n; static int array[n];
не работаетuint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);
...volatile
определить указатель.volatile
... Отдых зависит. Отладчики, которые у меня были вручную в этих случаях, также легко могут быть устранены*x
. С другой стороны, если регистры отображаются в какой-то области памяти, а компилятор не поддерживает непосредственное размещение переменных в определенных местах памяти (я видел оба), иногда получение переменной в определенном месте памяти может быть немного запутанным (необходимость покрыть это в файле карты ...). В конце концов, меня не волнует наличие переменной в нужном месте или указателя, пока я могу получить задание, которое мне поручено;)С cppreference.com :
Помимо этого,
const
имеет одинаковую семантику в C и C ++, а заголовки Cconst
часто скомпилированы как условные заголовки C ++"extern C"
.источник
static const x;
в области видимости файла в C есть внутренняя связь. Связывание переменной C определяется областью, в которой она объявлена, а также наличием / отсутствием спецификаторов класса хранения.const
и другие классификаторы типов не играют в этом никакой роли.static const x;
у области видимости файла в C есть внешняя связь.int const x = 1
в C есть внешняя связь . Следовательно, вам нужноstatic
изменить связь на внутреннюю. Цитата довольно понятна для меня, в отличие от ваших комментариев.