Static、Extern、Volatile及Const关键字总结

转载 2015年07月09日 19:42:35

Static、Extern、Volatile及Const关键字总结

关键字static                                                                                                                         

关键字Const有什么作用?

staticC中主要用于定义全局静态变量、定义局部静态变量、定义静态函数。在C++中新增了两种作用:定义静态数据成员、静态函数成员。

注意:因为static定义的变量分配在静态区,所以其定义的变量的默认值为0,普通变量的默认值为随机数,在定义指针变量时要特别注意。

关键字Const在C中的具体作用分析

C语言中,关键字static本地化数据和代码范围的好处,其三个明显的作用:

1.在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2.在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3.在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

C\C++static的区别分析

Cstatic用来修饰局部静态变量和外部静态变量、函数。而C++中除了上述功能外,还用来定义类的成员变量和函数,即静态成员和静态成员函数。

注意:编程时static的记忆性、全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而C++的静态成员则可以在多个对象实例间进行通信,传递信息。

关键字extern                                                                                                                      

extern的作用是什么?

extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。

告诉编译器这个变量或者函数的定义不在当前的代码中,等到连接时从别的地方找,如果找到了就可以正常编译,如果找不到就编译失败。

在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:
[extern]  函数类型  函数名(函数参数表)
{……}
调用外部函数时,需要对其进行说明:
[extern]  函数类型  函数名(参数类型表)[,函数名2(参数类型表2)……]

C\C++函数兼容时externC”的作用  

C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?  

答案与分析:C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况。此时C函数就需要用externC”进行链接指定,这告诉编译器请保持我的名称,不要给我生成用于链接的中间函数名。  

下面是一个标准的写法:

//.h文件的头上

#ifdef __cplusplus

#if __cplusplus

extern "C"{ 

#endif 

#endif  /* __cplusplus */  

 

//.h文件结束的地方 

#ifdef __cplusplus

#if __cplusplus

}

#endif

#endif  /* __cplusplus */ 

关键字volatile                                                                                             

关键字volatile有什么含意?并给出三个不同的例子?

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

下面是volatile变量的几个例子:

1.并行设备的硬件寄存器(如:状态寄存器);

2.一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3.多线程应用中被几个任务共享的变量;

分析:搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。

关键字const                                                                                                 

关键字Const有什么用途?

(1)可以定义const常量。

(2)const可以修饰函数的参数和返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

分析:

const用来定义一个只读的变量或对象。主要优点:便于类型检查、同宏定义一样可以方便地进行参数的修改和调整、节省空间,避免不必要的内存分配、可为函数重载提供参考。

const修饰函数参数,是一种编程规范的要求,便于阅读,一看即知这个参数不能被改变,实现时不易出错。

关键字Const有什么含义?

const修饰的对象意味着该对象是“只读”,但不意味着“常数”;

1.关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。

2.通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

3.合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

例子:

const int a;  // a是一个常整型数

int const a;  // a是一个常整型数

const int *a;  // a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)

int * const a;  // a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)

int const * a const;  // a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)

 

Const与#define相比有什么不同?

 

C\C++Const的区别分析

分析:

使用范围区别:

在C程序中,const的用法主要有定义常量、修饰函数参数、修饰函数返回值。

在C++程序中,它还可以修饰函数的定义体,定义类中某个成员函数为恒态函数,即不改变类中的数据成员。

使用时区别:

在C中,const的意思是“一个不能被改变的普通变量,是只读的”,它总是占用内存且C编译器不能把const看成一个编译期间的变量。

例子:

const buffsize = 100;

char buf[bufsize];//C编译出错,而C++支持编译成功。因为编译不知道const变量的值。

另外,在C中默认const是外部连接的,而C++const变量默认是内部连接的。

int num = 3;

const int buffsize = num;

char buf[buffsize];//C++编译出错,因为非const变量及要到运行阶段才知道其值的const变量都不能用于定义数组的维数;

例子:

const bufsize;    //C++中这样是不对的,而C支持,因C编译器则把它当作一个声明,指明在别的地方有内存定义分配。如果在C++中要实现Cconst的外部连接则必须使用extern把内部连接改成外部extern const bufsize,该形式亦可作为C中的外部声明。C中限定符const不是很有用,所以C迫使程序员在预处理器里使用#define。但是C++中则应尽量避免使用#define而换成const

extern和volatile的用法

extern 的用法 extern的用法的对象主要是变量和函数。 用extern声明外部变量 ①什么是外部变量 外部变量是指在文件或者函数外部定义的全局变量。外部变量仅定义一次并且在所有的函数之外。...
  • XGsilence
  • XGsilence
  • 2014年03月01日 11:12
  • 2797

嵌入式编程中关于const,static,extern,volatile的用法

一.const的用法:为什么使用const? 采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。const最常见用途是作为数组的边界和switc...
  • neuq521
  • neuq521
  • 2013年01月21日 14:26
  • 1187

static extern const 静态全局变量与全局变量的区别

static:和extern是用来设置作用域的 const:设置变量只可以被读,不可以被修改static:用static修饰的变量,在其所限定的作用域中只会有一分内存1:在一个函数内部:说明是一个静...
  • li15809284891
  • li15809284891
  • 2017年02月08日 09:54
  • 1376

C语言 static和extern关键字 对变量的作用

上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问;extern用来定义和声明一个外部函数,允许其他文件访问。static和extern对变量也有...
  • VNanyesheshou
  • VNanyesheshou
  • 2016年01月11日 13:27
  • 2244

ios高效开发-如何正确使用const,static,extern

前言 本篇主要介绍在开发中怎么使用const,static,extern3个关键字,如果喜欢我的文章,可以关注我微博:吖了个峥,也可以来小码哥,了解下我们的iOS培训课程。后续还会更新更多内容。...
  • daleiwang
  • daleiwang
  • 2016年01月25日 15:32
  • 6679

C/C++中volatile关键字详解

1. 为什么用volatile?     C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。这是 BS 在 "The...
  • whatday
  • whatday
  • 2016年09月12日 10:03
  • 1433

C++中的extern和const总结

作者:云梦泽 时间:2013.11.08 出处:http://write.blog.csdn.net/postlist 声明:版权所有,侵犯必究,如有转载请声明出处 一、extern extern用于...
  • u012333003
  • u012333003
  • 2013年11月08日 21:00
  • 2142

iOS之 深究extern,static的用法和作用

extern首先看代码示例:GDGPerson.m 文件#import "GDGPerson.h"@implementation GDGPerson int age = 10; @end main.m...
  • gezi0630
  • gezi0630
  • 2016年07月22日 13:18
  • 2628

定义和声明以及extern、static关键字

1. 定义只能进行一次,声明可以多次。 2. 变量定义是为变量分配存储空间,也可以初始化,不初始化的定义如:int i; 3. 声明是表明变量的类型和名称,因此定义也是声明。 4 ....
  • cj19920421
  • cj19920421
  • 2016年07月24日 16:53
  • 642

浅谈volatile关键字

Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字。volatile,从字面上说是易变的、不稳定的,事实上,也确实如此,这个关...
  • u011519624
  • u011519624
  • 2017年03月19日 18:10
  • 788
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Static、Extern、Volatile及Const关键字总结
举报原因:
原因补充:

(最多只允许输入30个字)