Wie funktioniert extern in Namespaces?

Ich führe ein einfaches Programm aus, ähnlich dem, was ich gefunden habeHie. Es soll das Aufblähen von Code verringern, wenn Konstanten in mehreren Dateien enthalten sind. Dazu werden globale Variablen const in einem Namespace mit ihrem jeweiligen @ verwendeextern Forward-Deklarationen.

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

Ich gehe davon aus, dass Constants :: pi den Wert pi erhält, der im Namespace globals.cpp Constants enthalten ist, und dass dies möglich ist, da Constants :: pi über die eingeschlossenen globals.h auf den Namespace selbst zugreifen kann. Was ich nicht verstehe, ist warum dasconst globale Definitionen / Initialisierungen in globals.cpp brauche dasextern Stichwort? Ich habe versucht, das @ zu entfernextern keywords in globals.cpp denken, dass es nicht benötigt wird, aber mein Programm läuft nicht ohne sie. Ich dachteextern wurde nur für Forward-Deklarationen verwendet? Warum werden sie für das @ benöticonst globale Definitionen / Initialisierungen? Hat es etwas mit dem Namespace zu tun, in dem sie definiert sind?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage