Como o extern trabalha nos namespaces?

Estou executando um programa simples semelhante ao que encontreiaqui. Ele visa reduzir o inchaço do código ao incluir constantes em vários arquivos. Isso é feito usando variáveis globais const dentro de um espaço para nome com seus respectivosextern declarações avançadas.

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;
}

Suponho que Constants :: pi obtenha o valor pi contido no espaço de nomes constantes globals.cpp, e é capaz de fazê-lo porque tem acesso ao próprio espaço de nomes a partir de globals.h incluído. O que eu não entendo é por que odefinições / inicializações globais const no globals.cpp precisa doextern palavra-chave? Eu tentei remover oextern palavras-chave em globals.cpp pensando que não era necessário, mas meu programa não será executado sem elas. eu penseiextern foi usado apenas para declarações futuras? Por que eles são necessários para odefinições / inicializações globais const? Tem algo a ver com o espaço para nome em que estão definidos?

questionAnswers(1)

yourAnswerToTheQuestion