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则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo( int x, int y );
该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。
 
用一句话概括extern “C”这个声明的真实目的:实现C++与C及其它语言的混合编程

如果在模块A中函数声明了foo为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数,模块B应该用#include "moduleA.h",这样做的结果就是:

(1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;
(2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。
常量默认是静态声明的,所以
//file1.c
const float pi = 3.14159265;
//file2.c
extern const float pi;
是不会链接成功的,但是
//file1.c
extern const float pi = 3.14159265;
//file2.c
extern const float pi;
是可以链接成功的。

为解决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

命名空间 extern的用法 static全局变量的更多相关文章

  1. 《OOC》笔记(1)——C语言const、static和extern的用法

    <OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用c ...

  2. static和extern的用法小结

    以前写程序是,基本不管static和extern,一个工程文件也只有一个c文件.今天尝试用多个文件来写,自然就涉及到这两个关键词的使用,自己查了些资料,并且做了些实验,总结如下. extern的用法 ...

  3. extern "c"用法解析

    转自: extern "c"用法解析 - 简书 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言, ...

  4. extern "C" 用法解析

    extern "c"用法解析 作者 作者Jason Ding ,链接http://www.jianshu.com/p/5d2eeeb93590 引言 C++保留了一部分过程式语言的 ...

  5. 变量的声明和定义以及extern的用法

    变量的声明和定义以及extern的用法                                          变量的声明不同于变量的定义,这一点往往容易让人混淆. l         变量 ...

  6. extern的用法

    extern作为外部函数声明的用法: 1. 可以扩展函数的应用范围: 107.h #ifndef _107H_ #def _107H_ extern void func(); #endif 107.c ...

  7. static全局变量与普通全局变量的区别,static局部变量与普通局部变量的区别,static函数与普通函数的区别

    static全局变量与普通全局变量的区别 static全局变量和普通全局变量的存储方式没有不同,如果它们都已经初始化,那么存放在进程的数据段中,否则存放在bss段.这两者的不同点在于作用域不同,当一个 ...

  8. C++基础--extern的用法

    extern作为外部变量扩展的用法: 1. 主要作用是扩展变量或者函数的应用范围: 2. extern的用法是相对于全局变量而言: 3. 在看到extern这个关键字的时候说明这个变量已经在别的源文件 ...

  9. 关于extern的用法

    extern表示该变量或者函数时在另一个地方定义了. 在C++编程中,如果将程序分为多个文件,则需要有在文件间共享代码的方法,这时如果一个变量或者函数需要在多个文件中使用,则可以使用extern来声明 ...

随机推荐

  1. COMBIN14简单应用

    目录 案例1 说明 APDL代码 结果 案例2 说明 APDL代码 结果 案例3 说明 APDL代码 结果 参考网址:http://blog.sina.com.cn/s/blog_65936c2301 ...

  2. [随笔][Life][咖啡][咖啡分类]

    转载自:https://www.chalook.net/doc/201607/4710.shtml

  3. dmi-ipmi

    api,cli,gui,tui,dmi(smbios),ipmi,bios,efi,uefi SMBIOS(System Management BIOS)是主板或系统制造者以标准格式显示产品管理信息所 ...

  4. java_basic_基础

    变量 类型 运算符 条件 循环 调试 字符串 数组 从键盘输入数据 switch的用法 从变量接收值 从键盘接收值 输出到一个文件 基本类型的赋值与引用类型的赋值是不一样的 是将引用类型的地址 每一个 ...

  5. Linux打开文件设置

    在某些情况下会要求增加Linux的文件打开数,以增加服务器到处理效率,在Linux下查看最多能打开的文件数量为: cat /proc/sys/fs/file-max 然后设置ulimit -n 文件数 ...

  6. [转]SQL server2008 导入超大SQL脚本文件(超过10M)

    同事给我一个sqlserver的学习库,sql脚本导出有300m,gui执行有内存溢出的错误报出来,所以问了一下度娘,学而时习之:) 1. SQL server2008 导入超大SQL脚本文件(超过1 ...

  7. htm5-websocket实现数据查询应用

    htm5-websocket实现数据查询应用   在之前的文章讲述了使用Websocket调用远程方式的功能,在这基础我们可以简单地使用WebSocket进行数据处理方面的应用;只需要在方法执行相关的 ...

  8. Emscripten 安装和使用

    OS: Windows 10 x64 I. install 0. pre install Python2.7 Node js Java 1. down git clone https://github ...

  9. 一入爬虫深似海,从此游戏是路人!总结我的python爬虫学习笔记!

    前言 还记得是大学2年级的时候,偶然之间看到了学长在学习python:我就坐在旁边看他敲着代码,感觉很好奇.感觉很酷,从那之后,我就想和学长一样的厉害,就想让学长教我,请他吃了一周的饭,他答应了.从此 ...

  10. python中建模分析零息票收益率曲线--复利和连续复利

    收益率曲线(Yield Curve)是显示一组货币和信贷风险均相同,但期限不同的债券或其他金融工具收益率的图表.纵轴代表收益率,横轴则是距离到期的时间.在此用python建模分析零息票收益率曲线,输出 ...