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