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?