google C++ 规范 之 命令空间

为什么要有命令空间:

命名空间是用来组织和重用代码的。如同名字一样的意思,NameSpace(名字空间),之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了。为了解决这个问题,引入了名字空间这个概念,通过使用 namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的,这样一来就不会引起不必要的冲突了。

命名空间的定义:

namespace namespace_name

{

// 代码声明

}

命名空间的用法:

1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下: std::cout << std::hex << 3.4 << std::endl;

2、使用using关键字。 using std::cout; using std::endl; using std::cin; 以上程序可以写成 cout << std::hex << 3.4 << endl;

3、最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。

 

using声明: 

google C++ 规范 之 命令空间

 

using 指示:

#include<iostream>
using namespace std;
int main(int argc,char **argv){
    cout<<"hello world!"<<endl;
}

using指示的作用域同一般的作用域规则不同,会将作用域注入到命名空间的上一层中去。

 

命令空间的作用域: 

using声明引入的名字的作用域满足一般的作用域规则:有效范围从using声明的地方开始,到其语句所在的作用域结束时为止。也就是说,using声明可以出现在局部作用域(如函数作用域等等)。有个特殊的地方是类作用域中只能声明基类成员

https://blog.****.net/D_Sfei/article/details/79414534

 

陷阱: 

1. 位于命令空间中的变量是无法直接访问的, 需要指定命令空间. 

2. 禁止使用指示声明。 没什么鸟用,还具坑。 

3、 不允许在函数中声明命名空间。

4. 两处声明的命名空间同名,它们同属一个命名空间。这是C++命名空间从来就有的特性

 

 

例子: 

#include <iostream>
using namespace std;

namespace first_name_space
{
    void func()
    {
        cout << "Inside first_name_space." << endl;
    }
}

namespace second_name_space
{
    void func()
    {
        cout << "Inside second_name_space." << endl;
    }
}

namespace blip
{
    int i = 0, j = 5, k = 6;
}

/* test2: 如果这样声明的话
* result:“second_name_space::func”: 对重载函数的调用不明确, 编译器不晓得你要用的是哪个? 
using namespace first_name_space;
using namespace second_name_space;
*/

using namespace first_name_space;

/* 此处会和下面的using namespce blip命名空间中的i 冲突。 
int i = 11;
*/

int main()
{
    /* test1:  using namespace 不会覆盖显示的命令空间
    first_name_space::func();
    second_name_space::func();
    */
    func();
    using namespace blip;
    cout << i << endl;
    system("pause");
    return 0;
}

内联命名空间: 内联命名空间主要用来保持跨版本的 ABI 兼容性

https://blog.****.net/craftsman1970/article/details/82872497

评价: 应用场景很窄,但是很神奇。 好像是C++为解决某一个单独的问题,而想出来的办法。 

 

在头文件中禁止使用命名空间。 

https://www.cnblogs.com/Colored-Mr/p/5010398.html

用namespace 包括冲突的代码,然后使用的时候指明namespace.  声明还是声明, 实现还是实现。 

该需要声明的地方还是需要声明。 该实现的地方还是需要实现。