В стандарте 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 Стандарта.