std是标准库中的命名空间;
关于extern的用法可以参考文献http://blog.163.com/sunjinxia%40126/blog/static/9498487920131214502107/,讲解的非常清晰
这里有一个关于static全局变量的讲解http://www.360doc.com/content/16/0115/15/15947598_528164347.shtml
引用一个定义在其它模块的全局变量或函数(如,全局函数或变量定义在A模块,B欲引用)有两种方法,一、B模块中include模块A的头文件。二、模块B中对欲引用的模块A的变量或函数重新声明一遍,并前加extern关键字。
被extern "C"修饰的变量和函数是按照C语言方式编译和连接的;
为解决c++标准库中的标识符与程序中的全局标识符之间以及不同库中的标识符之间的同名冲突,标准c++库的所有标识符都定义在
一个名为std的命名空间中。如下所示:
引入命名空间的原因:
命名空间是ANSI c++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。
在c++程序中,有大量的变量、函数和类名,如果它们搜存在于同一个全局命名空间中,会导致很多冲突。
1. 自定义函数与标准库函数 函数重名
2.程序中使用的名字与第三方库中名称相同
3.同一项目不同模块(可能由不同程序员负责)中名字冲突
命名空间的机制,对于声明于其中的名称都进行了本地化:
相同的名称可以在不同的上下文中使用,而不会引起名称的冲突;
c++中的标准库被定义到std命名空间中,减少了与用户自定义名称的冲突;
在自己的程序中创建自己的命名空间,避免本地化的名称与外界冲突。
在有冲突的情况下,假如我们自定义过的命名空间 name1和name2中都有标识符name,name在同一个程序中使用的时候就要这样:
name1::name
name2::name
而不能在开头用using namespace name1;using namespace name2;了!!
命名空间的使用:
自定义命名空间的时候把一些全局实体分别放在各个命名空间中进行分隔,建立一些互相分隔的作用域,以免产生名字冲突:
namespace ns2//指定命名空间ns1
{
int a;
double b;
class Table{
......
}
namespace ns1
{int age;}
}
引用的时候就是ns2::ns1::age
1.声明一个命名空间:
namespace 命名空间名
{声明}
命名空间中的声明部分可以包括下面的类型:
变量(可以带有初始化)及常量
函数(可以是定义或声明)
结构体
类
模板
命名空间(在一个命名空间中又定义一个命名空间,即嵌套的命名空间)
2. 简化使用命名空间成员的机制
(1)使用命名空间别名
namespace TV=Television;//TV等同Television
这样在使用Television的时候就可以用TV了。
(2)使用格式:using 命名空间成员名
比如:using ns1::Student;//Student等同ns1::Student
(3)使用:using namespace 命名空间名(容易产生重名冲突)
重名问题的解决:
1. 修改本地名字
2. 加上全局限定符,使用::。 比如 ::distance,这样写的原因是当::前面没有任何名字的时候仅仅表示后面的名字是当前程序本地中的全局变量!!
3. 去掉冲突的外部的命名空间,让步于本地的名字,当本地要使用外部命名空间中的其他的标识符的时候,用::比如:std::cout