Это потому, что объявление const
в области именного пространства подразумевает внутреннюю связь. Объект с внутренней связью доступен только в пределах единицы перевода, в которой он определен. Таким образом, в некотором смысле, один const
объект, который у вас есть в c.h
, на самом деле является двумя разными объектами, один внутренний для a.cpp
и один внутренний для b.cpp
.
Другими словами,
const int x = ...;
эквивалентно
static const int x = ...;
, а
int x;
похож на
extern int x;
потому что объявления не const
в области именного пространства подразумевают внешнюю связь. (В этом последнем случае они фактически не эквивалентны. extern
, так же как и явное указание внешней связи, создает объявление , а не определение объекта.)
Обратите внимание, что это относится к C ++. В C const
не изменяет подразумеваемую связь. Причина в том, что комитет C ++ хотел, чтобы вы могли написать
const int x = 5;
в шапке. В C этот заголовок, включенный в несколько файлов, может вызвать ошибки компоновщика, потому что вы будете определять один и тот же объект несколько раз.