Связь идентификаторов в C ++, объявленная с помощью спецификатора extern - PullRequest
1 голос
/ 11 февраля 2020

В стандарте C (6.2.2 Связи идентификаторов) достаточно написано:

4 Для идентификатора, объявленного с помощью спецификатора класса хранения extern в области, в которой предшествующий объявление этого идентификатора является видимым, 31) если в предыдущем объявлении указана внутренняя или внешняя связь, связь идентификатора в более позднем объявлении совпадает с связью, указанной в предыдущем объявлении. Если никакое предыдущее объявление не видно или если в предыдущем объявлении не указана связь, то идентификатор имеет внешнюю связь.

Однако я не могу найти аналогичное утверждение в стандарте C ++, просматривая его раздел 6.5 Программа и связь.

Этот вопрос возникает из-за следующей цитаты из стандарта C ++ 17

3 Имя, имеющее область имен (6.3.6), имеет внутреннюю связь, если оно является именем из

(3.2) - не встроенная переменная энергонезависимого типа с константной квалификацией, которая явно не объявлена ​​как внешняя и не объявлена ​​ранее как имеющая внешнюю связь; или

Теперь рассмотрим следующие объявления

const int x = 100;
extern const int x;

Так что неясно, является ли код некорректным или константа x имеет внутреннюю связь, хотя она объявлена ​​с помощью спецификатор extern или Стандарт содержит дефект в описании этого параграфа, или я пропустил цитату в Стандарте C ++, похожую на цитату из C Стандарта.

...