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

来源:互联网 发布:java购物车实现原理 编辑:程序博客网 时间:2024/06/05 17:03

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


From: http://blog.csdn.net/ruyue_ruyue/article/details/8201900

0 0
原创粉丝点击