【C++】定义全局常量的一个优雅的方案

先列举两种常见的方案

1.  宏定义

#define pi 3.14

这种方案在C语言的项目中很常见,虽然《Effictive C++》第二节作者建议使用更多的const或者enum,但是我觉得#define在这个用法上除了没有编译器的类型检查,实在不失优雅。


2. 使用关键字extern

file1.xxx

extern const int globalValue = 1; // 全局变量定义


file2.xxx

extern const int globalValue ; // 声明全局变量

int localValue = 1 + globalValue  // 使用该变量

这种方案太难看了!一旦很多个文件都要使用这个变量的话,就要声明很多次


下面是我认为一种比较优雅的方案

namespace!借助命名空间的变量可以在全局范围访问的特性。下面是一个例子

文件1,在命名空间内定义常量

// declare.h
namespace panda
{
	class Foo
	{
	public:
		Foo(){ cout << "Foo construction\n"; }
		~Foo(){ cout << "Foo destruction\n"; }
	};

	// 类常量
	// main函数之前已经构造好,main函数结束后才析构
	const Foo foo;

	// 内置常量
	const double pi = 3.14;
};

文件2,访问常量

#include 
#include 
using namespace std;

#include "declare.h"

int main()
{
	cout << "main begin" << endl;
	cout << panda::pi << endl; // 在其他文件使用常量
	cout << "main end" << endl;
	return 0;
}


运行结果:



特别关注一下,类常量在主函数开始运行之前初始化,生命周期一直保持到主函数的结束。而且,其他文件要使用该常量时不用特别声明。

这种方法相对与前面的是不是更C++更优雅呢

你可能感兴趣的:(C++,c++,namespace)