Как extern работает в пространствах имен?

Я запускаю простую программу, похожую на то, что я нашелВот, Он предназначен для уменьшения раздувания кода при включении констант в несколько файлов. Это достигается путем использования глобальных переменных const в пространстве имен с соответствующимиextern жду деклараций.

globals.h

#ifndef GLOBALS_H_
#define GLOBALS_H_

namespace Constants
{
    // forward declarations only
    extern const double pi;
    extern const double avogadro;
    extern const double my_gravity;
}

#endif

globals.cpp

namespace Constants
{
    // actual global variables
    extern const double pi(3.14159);
    extern const double avogadro(6.0221413e23);
    extern const double my_gravity(9.2); // m/s^2 -- gravity is light on this planet
}

source.cpp

#include <iostream>
#include <limits>

#include "globals.h"

int main()
{
    double value_of_pi = Constants::pi;

    std::cout << value_of_pi;

    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cin.get();

    return 0;
}

Я предполагаю, что Constants :: pi получает значение pi, содержащееся в пространстве имен Constants globals.cpp, и может сделать это, поскольку имеет доступ к самому пространству имен из включенного globals.h. Я не понимаю, почемуconst global определения / инициализации в globals.cpp нуженextern ключевое слово? Я пытался удалитьextern ключевые слова в globals.cpp, думая, что это не нужно, но моя программа не будет работать без них. я думалextern был использован только для предварительных деклараций? Зачем они нужны дляconst global определения / инициализации? Это как-то связано с пространством имен, в котором они определены?

Ответы на вопрос(1)

Ваш ответ на вопрос