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声明:
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. 声明还是声明, 实现还是实现。
该需要声明的地方还是需要声明。 该实现的地方还是需要实现。