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

相关文章推荐

嵌入式中最重要的四个词语static,extern,volatile,const

嵌入式中最重要的四个词语static,extern,volatile,const

c++ extern的用法,extern全局变量和static、const的的区别

作用一:当它与"C"一起连用时,如extern "C" void fun(int a, int b);,则编译器在编译fun这个函数名时按C的规则去翻译相应的函数名而不是C++的。 作用二:当它不与"...
  • deyuzhi
  • deyuzhi
  • 2016年08月24日 08:55
  • 1950

C语言中关键字const、static、volatile的用法分析

const 作为一个程序员,我们看到关键字”const”时,首先想到的应该是”只读”。因为,它要求其所修饰的对象为常量,不可对其修改和二次赋值操作(不能作为左值出现)。看几个例子: co...
  • yayawy
  • yayawy
  • 2016年05月16日 16:07
  • 2915

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

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

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...

利用K-means聚类算法根据经纬度坐标对中国省市进行聚类

K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...

Radon变换理论介绍与matlab实现--经验交流

本人最近在研究Radon变换,在查阅了各种资料之后在此写下个人的理解,希望与各位牛牛进行交流共同进步,也使得理解更加深刻些。 Radon变换的本质是将原来的函数做了一个空间转换,即,将原来的XY平...

CT图像重建技术

由于csdn贴图不方便,并且不能上传附件,我把原文上传到了资源空间CT图像重建技术 1.引言 计算机层析成像(Computed Tomography,CT)是通过对物体进行不同角度的射线投影测量而...

Matlab绘图-很详细,很全面

Matlab绘图强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Ma...

linux查找目录下的所有文件中是否含有某个字符串

查找目录下的所有文件中是否含有某个字符串  find .|xargs grep -ri "IBM"  查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名  find .|xargs g...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Static、Extern、Volatile及Const关键字总结
举报原因:
原因补充:

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