Вы правы, что extern
не требуется в файле cpp.
Во-первых, вам необходимо понять, что такое объявление и определение.Вашему bufSize
требуется объявление в каждой используемой единице перевода и одно определение внутри вашей программы.Итак, давайте посмотрим, что у вас есть в файле .h:
extern const int bufSize;
Это допустимое объявление переменной const int
.Здесь нет путаницы.
Теперь вам нужно определение, которое идет в файл .cpp, и вам нужно убедиться, что оно существует в одном месте во всей программе, иначе вы нарушаете ODR - One DefinitionПравило.Вот что у вас сейчас есть:
extern const int bufSize = fcn();
Это допустимое определение, поскольку любое объявление с внешним классом хранения и инициализатором является определением.Тем не менее,
const int bufSize = fcn();
также является определением.А с предыдущим объявлением extern
это определение имеет внешнюю связь - это означает, что к нему можно получить доступ из других единиц перевода (без этого const int bufSize
в области пространства имен будет иметь внутреннюю связь).
Bottomстрока - extern
в этом примере не влияет на поведение компилятора, но напоминает всем, кто читает код, что переменная имеет внешнюю связь (как это не сразу видно из этой строки).
Дальнейшее чтение:
https://en.cppreference.com/w/cpp/language/definition
https://en.cppreference.com/w/cpp/language/storage_duration