`

关键字auto、static、register、const、volatile 、extern

阅读更多

关键字auto、static、register、const、volatile 、extern

 

变量修饰符总结

(1)auto

  这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。

(2)register

  这个关键字命令编译器尽可能 的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。

(3)static

  常见的两种用途:
    1>统计函数被调用的次数;
    2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销.

  详细说明:
    1>、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
    2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
    3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。

  使用注意:
    1>若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
    2>若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
    3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)。

(4)const

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

  作用:
    1>修饰输入参数
      a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。
      b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。
    2>用const修饰函数的返回值
      a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
       如对于: const char * GetString(void);
       如下语句将出现编译错误:
        char *str = GetString();//cannot convert from 'const char *' to 'char *';
       正确的用法是:
       const char *str = GetString();
      b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 如不要把函数int GetInt(void) 写成const int GetInt(void)。
    3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.

   说明:
    const type m; //修饰m为不可改变
   示例:
    typedef char * pStr; //新的类型pStr;
    char string[4] = "abc";
    const char *p1 = string;
    p1++; //正确,上边修饰的是*p1,p1可变
    const pStr p2 = string;
    p2++; //错误,上边修饰的是p2,p2不可变,*p2可变
   同理,const修饰指针时用此原则判断就不会混淆了。
    const int *value; //*value不可变,value可变
    int* const value; //value不可变,*value可变
    const (int *) value; //(int *)是一种type,value不可变,*value可变
              //逻辑上这样理解,编译不能通过,需要tydef int* NewType;
    const int* const value;//*value,value都不可变

(5)volatile

  表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的 值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对 象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.
  该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。
  简单示例:
   DWORD __stdcall threadFunc(LPVOID signal)
   {
     int* intSignal=reinterpret_cast(signal);
     *intSignal=2;
     while(*intSignal!=1)
     sleep(1000);
     return 0;
   }
  该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:
     mov ax,signal
     label:
     if(ax!=1)
     goto label
   对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时 候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:
     label:
     mov ax,signal
     if(ax!=1)
     goto label

  注意: 一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

(6)extern

  extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。

 

 

分享到:
评论

相关推荐

    C语言中关键字const、static、volatile、extern、auto、register的用法分析.doc

    C语言中关键字const、static、volatile、extern、auto、register的用法分析 本文将对C语言中的六个关键字:const、static、volatile、extern、auto、register进行详细的分析和解释。 一、const关键字 Const关键字...

    const,extern,static,volatile的使用

    ### const、extern、static、volatile ...通过以上的介绍可以看出,`const`、`extern`、`static` 和 `volatile` 这四个关键字在 C 和 C++ 中有着广泛的应用。正确地使用这些关键字可以极大地提高代码的质量和可维护性。

    C语言中auto register static const volatile 区别

    C语言中auto register static const volatile的区别 在C语言中,auto、register、static、const和volatile是五个关键字,分别有其独特的用途和特性。 auto auto关键字用于声明变量的生存期为自动,即将不在任何类...

    C语言中auto,register,static,const,volatile的区别.docx

    在C语言中,有五个特殊的关键词用来控制变量的存储类别和行为:`auto`、`register`、`static`、`const`和`volatile`。它们各有不同的用途和特点: 1. **`auto`**: 这个关键词并不常用,因为它是默认的存储类别。它...

    C语言中auto,register,static,const,volatile的区别详细解析

    在C语言中,有五种特殊的存储类别关键字:`auto`、`register`、`static`、`const`和`volatile`,它们用于定义变量的存储类型、生命周期和访问特性。下面将详细解释这些关键字的区别: 1. `auto`:`auto`关键字通常...

    C语言中32个关键字详解[参考].pdf

    在C语言中,存储级别关键字共有6个,分别是:auto、static、register、extern、const、volatile。 1. 自动变量关键字 * auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配。 2. 静态变量关键字 * ...

    C语言深度解剖

    1.1 最宽恒大量的关键字auto 1.2 最快的关键字register 1.3 最不实名的关键字static 1.4 基本数据类型 1.5 最冤枉的关键字sizeof 1.6 if/else组合 1.7 switch/case组合 1.8 do/while/for关键字 1.9 goto关键字 1.10 ...

    C_gjz.rar_float

    C语言中的关键字 auto :声明自动变量 一般不使用 double :声明双精度变量或函数 float:声明浮点型变量或函数 int: 声明整型变量或函数 short :声明短整型变量或函数 long :声明长整型变量或函数 struct:声明...

    vc关键字,仅供参考

    根据给定的文件信息,以下是对“vc关键字”的详细解析,包括了auto、register、static、const、volatile以及extern等关键字的重要特性和使用场景。 ### 1. auto `auto`关键字在C++中用于自动推导变量类型,使得...

    C语言关键字 C语言关键字 C语言关键字

    在本篇文章中,我们将深入探讨C语言中的关键字及其用法。C语言作为一种广泛使用的编程语言,在软件开发领域占据着极其重要的地位。理解并熟练掌握C语言的关键字是学习该语言的基础,也是成为一名合格程序员的...

    C语言中的32个关键字

    - **存储级别关键字**包括`auto`、`static`、`register`、`extern`、`const`和`volatile`。 #### 流程控制关键字 流程控制关键字用于控制程序的执行流程,包括: - **跳转结构**:如`return`、`continue`、`break`...

    C语言常见面试要点 必看

    笔试,面试之前必看: Const关键字; CExtern关键字; Static关键字; stdafx 头文件的意义; stdcall cdecl fastcl ...Volatile vs Register 关键字; 全局变量与局部变量初始值问题; 标准库; 字面常量; 数据对齐;

    初级C语言教案 auto break case char const

    里面介绍的 很详细auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef unsigned union void ...

    统计C语言关键字频度

    它们包括但不限于`auto`、`break`、`case`、`char`、`const`、`continue`、`default`、`do`、`double`、`else`、`enum`、`extern`、`float`、`for`、`goto`、`if`、`int`、`long`、`register`、`return`、`short`、`...

    c语言32个关键字.pdf

    auto关键字用于指定变量为自动存储周期,由系统自动分配和释放,通常用于函数的局部变量。static关键字指定变量为静态存储周期,这意味着变量的值在程序的整个执行期间保持不变,并且在函数外部也可访问。extern...

    C++关键字大全(67个).txt

    C++关键字大全(67个) asm auto bad_cast bad_typeid bool break case catch char class const const_cast continue default delete do double dynamic_cast else enum except explicit extern false finally float ...

    C语言32以及C63个关键字及其含义.doc

    auto关键字用于声明自动变量,自动变量是指在函数内部声明的变量,它们的存储类别是自动的,即它们的生命周期是从声明到函数返回时销毁的。 2. break:不能用于循环语句与switch语句之外的任何其他语句中。作用为...

    C语言关键词解释.pdf

    C语言中有六种存储级别关键字,分别是auto、static、register、extern、const和volatile。 * auto:auto关键字用于指定变量为自动变量,由编译器自动分配及释放。 * static:static关键字用于指定变量为静态变量,...

Global site tag (gtag.js) - Google Analytics