Static、Extern、Volatile及Const关键字总结
关键字static
关键字Const有什么作用?
static在C中主要用于定义全局静态变量、定义局部静态变量、定义静态函数。在C++中新增了两种作用:定义静态数据成员、静态函数成员。
注意:因为static定义的变量分配在静态区,所以其定义的变量的默认值为0,普通变量的默认值为随机数,在定义指针变量时要特别注意。
关键字Const在C中的具体作用分析
在C语言中,关键字static有本地化数据和代码范围的好处,其三个明显的作用:
1.在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2.在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3.在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
C\C++中static的区别分析
在C中static用来修饰局部静态变量和外部静态变量、函数。而C++中除了上述功能外,还用来定义类的成员变量和函数,即静态成员和静态成员函数。
注意:编程时static的记忆性、全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而C++的静态成员则可以在多个对象实例间进行通信,传递信息。
关键字extern
extern的作用是什么?
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。
告诉编译器这个变量或者函数的定义不在当前的代码中,等到连接时从别的地方找,如果找到了就可以正常编译,如果找不到就编译失败。
在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数: [extern] 函数类型 函数名(函数参数表) {……} 调用外部函数时,需要对其进行说明: [extern] 函数类型 函数名(参数类型表)[,函数名2(参数类型表2)……];
C\C++函数兼容时extern“C”的作用
在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?
答案与分析:C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况。此时C函数就需要用extern“C”进行链接指定,这告诉编译器请保持我的名称,不要给我生成用于链接的中间函数名。
下面是一个标准的写法:
//在.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++中要实现C中const的外部连接则必须使用extern把内部连接改成外部extern const bufsize,该形式亦可作为C中的外部声明。在C中限定符const不是很有用,所以C迫使程序员在预处理器里使用#define。但是C++中则应尽量避免使用#define而换成const。