命名空间 extern的用法 static全局变量

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

原文地址:https://www.cnblogs.com/rednodel/p/9298346.html

时间: 2024-10-29 00:12:52

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

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

<OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用const修饰的函数形参 直接修饰 一个形如 int Minus(const int a, const int b, int testCase); 的函数,const的意义是什么呢? 答:参数a被const修饰,说明在Minus函数内,编译器不允许a被别的变量(例如x)赋值(修改).参数b同理. 如果你写了a

全局变量 /static全局变量 /局部变量/成员变量/extern 分析

part1 全局变量/static全局变量 1 若程序只有一个源文件(就是尼玛就一个类),则没区别,都是存储在静态区. (全局变量存储在静态区中 程序启动时就会分配存储空间 直到程序结束才会释放) 2 若程序有多个源文件(多个文件组成),则有区别 全局变量: 可以extern外部文件引用, static 全局变量: 则不可以外部文件引用 (仅仅本文件独享) part2 static:修饰变量(全局,局部)使用 / 全局变量/static变量 存储在静态区 程序运行 只初始化一次,程序结束,变量才

extern及extern “C”用法

1 基本解释extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. 另外,extern也可用来进行链接指定. 2 问题:extern 变量在一个源文件里定义了一个数组:char a[6];在另外一个文件里用下列语句进行了声明:extern char *a;请问,这样可以吗? 答案与分析:1).不可以,程序运行时会告诉你非法访问.原因在于,指向类型T的指针并不等价于类型T的数组.extern char *a声明的是一个指针变量

extern &quot;c&quot;用法解析

转自: extern "c"用法解析 - 简书 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同.extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的.由于C++支持函数重载,因此编译器编译函

extern &quot;C&quot; 用法解析

extern "c"用法解析 作者 作者Jason Ding ,链接http://www.jianshu.com/p/5d2eeeb93590 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同.extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会

static全局变量与普通全局变量的区别?static局部变量与普通局部变量的区别?static全局函数与普通全局函数的区别?

1.static全局变量只初使化一次,防止在其他文件单元中被引用; 2.static局部变量只被初始化一次,下一次依据上一次结果值: 3.static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝 C语言中讲讲static变量和static函数有什么作用static关键字有两种意思,你看上下文来判断 1,表示变量是静态存储变量 表示变量存放在静态存储区. 2,表示该变量是内部连接 (这种情况是指该变量不在任何{}之内,就象全局变量那样,这时候加上static) ,也就是说在其它的.cp

java中静态代码块的用法 static用法详解

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的.静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是

static全局变量与普通的全局变量的区别

(1)static全局变量与普通的全局变量有什么区别?(2)static局部变量和普通局部变量有什么区别?(3)static函数与普通函数作用域有什么不同?(4)static函数与普通函数有什么区别? (1)static全局变量与普通的全局变量有什么区别?答:全局变量的说明之前再加以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式.这两者在存储方式上并无不同.这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,

20140806 交换两个数 extern &ldquo;C&rdquo;用法

1.交换两个数 方法1.a+b有可能越界 a=a+b; b=a-b; a=a-b; 方法二.不会越界 a=a^b b=a^b; a=a^b;   2.extern "C"用法 ( 自己总结: 1.C++语言引用C语言函数时(void fun(int a,int b),void fun(int a,float b)),由于C++有重载功能,编译器按C++的方式编译该函数后产生的名字五花八门(_fun_int_int和_fun_int_float). 2.而被调用的c语言函数库,或者.c文