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. fixed 相对于父容器定位

    当一个元素设置为 fixed 或 absolute,不设置 top, left 则会在原位置,而脱离文档流,别的元素可以存在于它之后. 而当使用 fixed 后还想相对于父容器进行定位,或者说在当前位 ...

  2. php输出数据到csv文件

    function export() { $fileName = date('Y-m-d').uniqid().'.csv'; set_time_limit(0); ini_set('memory_li ...

  3. 快速部署私人git服务--基于docker化Gogs

    Gogs 一款极易搭建的自助 Git 服务. 环境 Linux系统 docker 获取gogs镜像,并运行, docker run -it --: -p : -v /var/gogs:/data go ...

  4. python设置路径值时为什么要输入r

    r:代表处理不转义现象 Python中,u表示unicode string,表示使用unicode进行编码,没有u表示byte string,类型是str,在没有声明编码方式时,默认ASCI编码.如果 ...

  5. 【转】Entity Framework 复杂类型

    为了说明什么是复杂属性,先举一个例子. public class CompanyAddress { public int ID { get; set; } public string CompanyN ...

  6. 关于STL容器

    容器: 概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它 分类: 序列容器.关联容器.容器 ...

  7. 【python】dist-packages和site-packages的区别

    一.dist-packages和site-packages的区别 sudo apt-get install 安装的package存放在/usr/lib/python2./dist-packages目录 ...

  8. 正点原子stm32f103mini版串口下载BOOT0引脚与与CH340G芯片引脚RTS、DTR、的关系原理

    在做串口实验时,一直搞不明白一键下载是怎么回事,于是自己就去捉摸CH340G这块芯片,那么这里我将详细的讲解一下这块芯片怎么与stm32配合使用的. 1.由CH340G芯片资料可以知道这两个引脚的功能 ...

  9. git与github区别与简介

    From: https://blog.csdn.net/skyxmstar/article/details/65631658 git和github是两个完全不同的概念. git 是一个版本管理工具,是 ...

  10. 5.IAP - FLASH

    一.Flash与时钟系统的关系            STM32系统时钟:                 HSE 高速外部时钟,电路上焊接的外部时钟,一般是4Mhz-16Mhz,板子上的是8Mhz ...