我在运行一个类似于我在这里找到的简单程序。它旨在在多个文件中包含常量时减少代码膨胀。它通过在命名空间内使用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 获取了包含在 globals.cpp 的 Constants 命名空间中的 pi 值,并且能够这样做,因为它可以从已包含的 globals.h 中访问该命名空间。但我不理解为什么 globals.cpp 中的 const 全局定义/初始化 需要使用 extern
关键字?我尝试删除 globals.cpp 中的 extern
关键字,认为它不是必需的,但是我的程序无法正常运行。我认为 extern
只用于前向声明,那么为什么在const全局定义/初始化中需要它?是否与它们所定义的命名空间有关?
Constants
命名空间内的变量是真正的全局变量,但我认为命名空间具有作用域,因此其中的任何内容都不可以具备全局范围?并且,Constants::pi
是否从 globals.h 中 pi 的前向声明中获取标识符? - Wandering Foolmain()
之前创建并在离开后销毁,但它们确实存在于Constants
命名空间中,为了访问它们的名称,您必须指定Constants::
(或通过使用指令或使用声明隐式地发生)。我想最后一个问题的答案是“是”:由于头文件的原因,名称是可见的。 - Andy Prowl