欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Effective_C++:28、尝试切割global namespace(全局命名空间)

程序员文章站 2022-07-15 12:23:52
...

28、尝试切割全局命名空间

1、命名空间的使用

有三种方式使用命名空间:

1.导入命名空间的所有符号。若存在同名的临时变量,会掩盖命名空间的符号。

using namespace std;

2.导入命名空间的某个符号。若存在同名的临时变量,编译器会发生错误,名称冲突。

using std::cout;

3.使用符号时,用作用域操作符来指明命名空间。

std::cout << "Hello, world!";

2、为啥使用命名空间

在大型项目中,有多个文件,会定义很多全局变量,若存在同名的全局变量时,会发生名称冲突的问题。

一个方法是对每个文件的全局变量加上独特的前缀,保证不会出现同名的问题。然而,如此,可能使得名称变得很长。

另一个方法是使用命名空间。然后通过那三种方式去使用他。

3、尝试切割全局命名空间

尝试切割全局命名空间,即是使用命名空间来防止名称冲突。对于名称冲突的,则加命名空间来使用这些名称;对于没有名称冲突的,若是型别名称,用typedef,使得型别名称为命名空间的型别名称的同义词。若是static对象,则声明一个该对象的引用。若是static函数,用const指针代替。

//切割全局命名空间
namespace sdm {
    int label;
    static const double BOOK_VERSION;
    class Handle { ... };
    static Handle& getHandle();
    ...
}
const double BOOK_VERSION = 2.0;
//切割全局命名空间
namespace another {
    int label;
    ...
}
//使用名称符号
typedef sdm::Handle Handle;
const double& BOOK_VERSION = sdm::BOOK_VERSION;
sdm::Handle& (* const getHandle) () = sdm::getHandle;