Я запускаю простую программу, похожую на ту, что я нашел здесь. Это предназначено для уменьшения раздувания кода при включении констант в несколько файлов. Он делает это, используя константные глобальные переменные в пространстве имен с их соответствующими предварительными объявлениями 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, содержащееся в пространстве имен констант globals.cpp, и может это сделать, поскольку имеет доступ к самому пространству имен из включенного globals.h. Чего я не понимаю, так это зачем глобальным определениям/инициализациям const в globals.cpp нужно ключевое слово extern
? Я попытался удалить ключевые слова extern
в globals.cpp, думая, что это не нужно, но моя программа не будет работать без них. Я думал, что extern
используется только для предварительных объявлений? Зачем они нужны для глобальных определений/инициализаций const? Это как-то связано с пространством имен, в котором они определены?