现在的位置: 首页 > 综合 > 正文

C++ 重要修饰符

2013年12月10日 ⁄ 综合 ⁄ 共 3731字 ⁄ 字号 评论关闭

auto

对应自动生存周期


auto修饰符只能用在函数内的对象声明中,即仅在语句块内使用。
声明中有auto修饰符的对象具有自动生存周期。
它们仅存在于被定义的当前执行代码块中,即局部变量在进入模块时生成,在退出模块时消亡。
定义局部变量的最常见的代码块是函数。 语言中包括了关键字auto,它可用于定义局部变量。但自从所有的非全局变量的缺省值假定为auto以来,auto就几乎很少使用了。

static
对应静态生存周期

如果是定义在函数外,那么该对象具有内部链接,其它程序文件不能对其访问。如果是定义在函数内,那么该对象具有无链接,函数外不能对其访问。

(注意:static变量初始化时,只能用常量)

用 static 关键字修饰的局部变量称为静态局部变量。

静态局部变量存值如同全局变量,区别在于它只属于拥有它的函数,它也和全局变量一样会被初始化为空。


用 static 关键字修饰的全局变量是静态全局变量,静态全局变量只能用于定义它的单元。
用静态变量记录函数被调用的次数
const
const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。
extern
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。
在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 */ 

register
寄存器变量,对应自动生存周期
当声明对象有自动生存周期时,可以使用register修饰符。因此,register也只能用在函数内的声明中。
register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中(而不是栈或堆),以加快其存储速度。然而,编译器不见得会这么做,因此效果一般般。了解一下就行,不建议使用。

volatile

可能会被意想不到地改变
告诉编译器不要持有变量的临时拷贝,它可以适用于基础类型
也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.

以下引用:http://www.cnblogs.com/del/archive/2008/12/04/1347305.html


一、局部变量和全局变量:

(1)局部变量:局部变量也叫自动变量,它声明在函数开始,生存于栈,它的生命随着函数的返回而结束。

  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. {  
  5.     auto int i = 9; <span style="white-space:pre">  </span>//声明局部变量的关键字是 auto; 因可以省略,所以几乎没人使用  
  6.   
  7.     printf("%d\n", i);    
  8.     getchar();  
  9.     return 0;  
  10. }  
  1.   

(2)全局变量:全局变量声明在函数体外,一般应在函数前。每个函数都可以使用它,不过全局变量应尽量少用。

  1. #include <stdio.h>  
  2.   
  3. void add(void);  
  4. void mul(void);  
  5.   
  6. int gi = 3; <span style="white-space:pre">      </span>//全局变量(声明在函数外)  
  7.   
  8. int main(void)  
  9. {      
  10.     printf("%d\n", gi); //输出的是 3  
  11.   
  12.     add();  
  13.     printf("%d\n", gi); //输出的是 5  
  14.   
  15.     mul();  
  16.     printf("%d\n", gi); //输出的是 10  
  17.         
  18.     getchar();  
  19.     return 0;  
  20. }  
  21.   
  22. void add(void) {  
  23.     gi += 2;  
  24. }  
  25.   
  26. void mul(void) {  
  27.     gi *= 2;  
  28. }  

全局变量会被初始化为空, 而局部变量在没有赋值前是一个垃圾值:

  1. #include <stdio.h>  
  2.   
  3. int gi;<span style="white-space:pre">           </span>//全局变量  
  4.   
  5. int main(void)  
  6. {  
  7.     int i;<span style="white-space:pre">        </span>//局部变量  
  8.       
  9.     printf("%d, %d\n", gi, i);  
  10.         
  11.     getchar();  
  12.     return 0;  
  13. }  

当全局变量与局部变量重名时,使用的是局部变量:

  1. #include <stdio.h>  
  2.   
  3. int a = 111, b = 222;  
  4.   
  5. int main(void)  
  6. {  
  7.     int a = 123;  
  8.     printf("%d,%d\n", a, b);<span style="white-space:pre">  </span>//输出的是 123,222  
  9.   
  10.     getchar();      
  11.     return 0;  
  12. }  


二、对象的生存周期(lifetime)

(1)静态生存周期(即全局变量的生存周期)

具有静态生存周期的所有对象,都是在程序开始执行之前就被事先创建和初始化。它们的寿命覆盖整个程序的执行过程。如在函数内定义了一个static变量,那第一次调用该函数后,该变量的值将会被保留,当第二次被调用时,该变量的值还是第一次调用结束时的值。

(2)自动生存周期(即局部变量的生存周期)

自动生存周期的对象的寿命由“对象定义所处在的大括号{}”决定。每次程序执行流进入一个语句块,此语句块自动生存周期的对象就会被创建一个新实例,同时被初始化。


三、标识符的链接(linkage)

(1)外部链接

表示在整个程序中(多个程序文件)是相同的函数或对象。常见的有,在函数体外声明的extern变量。

(2)内部链接

表示只在当前程序文件中是相同的函数或对象。其它程序文件不能对其进行访问。常见的有,在函数体外声明的static变量。

(3)无链接

一般声明在函数内部的auto、register变量、还有函数的参数,都是无链接。它的作用域是函数内部。

四、存储类型修饰符总结:

存储类型修饰符可以修改标识符的链接和对应对象的生存周期;标识符有链接,而非生命周期;对象有生存周期,而非链接;函数标识符只可用static、extern修饰,函数参数只可用register修饰。


(1)auto(对应自动生存周期)

auto修饰符只能用在函数内的对象声明中,即仅在语句块内使用。

声明中有auto修饰符的对象具有自动生存周期。

它们仅存在于被定义的当前执行代码块中,即局部变量在进入模块时生成,在退出模块时消亡。

定义局部变量的最常见的代码块是函数。 语言中包括了关键字auto,它可用于定义局部变量。但自从所有的非全局变量的缺省值假定为auto以来,auto就几乎很少使用了。

(2)static(对应静态生存周期)

如果是定义在函数外,那么该对象具有内部链接,其它程序文件不能对其访问。如果是定义在函数内,那么该对象具有无链接,函数外不能对其访问。

(注意:static变量初始化时,只能用常量)

用 static 关键字修饰的局部变量称为静态局部变量。

静态局部变量存值如同全局变量,区别在于它只属于拥有它的函数,它也和全局变量一样会被初始化为空。

  1. #include <stdio.h>  
  2.   
  3. void fun1(void);  

抱歉!评论已关闭.