zoukankan      html  css  js  c++  java
  • 【C语言 C++】简单keywordRegister,Const,Static,Volatile,typedef,Define的理解

    Register

        用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器 中。但对32位编译器不起作用。当global optimizations(全局优化)开的时候,它会做出 选择是否放在自己的寄存器中;只是其他与registerkeyword有关的其他符号都对32位编译 器有效。

    Const

         被const修饰的东西都受到强制保护,能够预防意外的变动,能提高程序的健壮性。 它能够修饰函数的參数、返回值,甚至函数的定义体。(特别注意。在C语言中,const 饰的变量本质依然是变量;而在C++中,则变为常量。

    )

       1>參数

        a.对于非内部数据类型的输入參数,应该将“值传递”的方式改为“const引用传 递”。目的是提高效率。比如将void Func(A a) 改为void Func(const A &a)

        b.b.对于内部数据类型的输入參数,不要将“值传递”的方式改为“const引用传递”。

    否则既达不到提高效率的目的,又减少了函数的可理解性。比如void Func(int x) 不应该改void Func(const int &x)。应该写成void Func(const int x)

       2>返回值

        a.假设给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指 针)的内容不能被改动,该返回值仅仅能被赋给加const修饰的同类型指针。比如:const  char * GetString(void);char *str = GetString();//错误const char *str = GetString();//正确

       b.假设函数返回值採用“值传递方式”,因为函数会把返回值拷贝到外部暂时的存储单元 中,加const修饰没有不论什么价值。

       3>函数

        const成员函数的声明中,constkeyword仅仅能放在函数声明的尾部,表示该类成员不修 改对象

    Static

       1>修饰变量

        a.静态全局变量,作用域仅限于变量被定义的文件里。其它文件即使用extern  明也没法使用他。准确地说作用域是从定义之处開始。到文件结尾处结束,在定义 之处前面的那些代码行也不能使用它。

    想要使用就得在前面再加extern

        b.静态局部变量,在函数体里面定义的,就仅仅能在这个函数里用了,同一个文档中 的其它函数也用不了。因为被static 修饰的变量总是存在内存的静态区,所以即使这个函 数执行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。

        2>修饰函数

        函数前加static 使得函数成为静态函数。但此处“static”的含义不是指存储方式, 而是 指对函数的作用域仅局限于本文件(所以又称内部函数)

    使用内部函数的优点是:不 同的人编写不同的函数时,不用操心自定义的函数,是否会与其他文件里的函数同名。

    Volatile

        简单的说volatile的作用避免编译器优化。volatile提醒编译器它后面所定义的变量 随时都有可能改变,因此编译后的程序每次须要存储或读取这个变量的时候,都会直接从 变量地址中读取数据。假设没有volatilekeyword,则编译器可能优化读取和存储,可能暂 时使用寄存器中的值,假设这个变量由别的程序更新了的话,将出现不一致的现象。

    typedef 

       typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个 别名, 而非定义一个新的数据类型

       1>常规变量类型定义

       Typedef unsigned char uchar  //uchar a;(unsigned char a;)

       2>数组类型定义

       Typedef int arr[2]           //arr a;(int a[2];)

       Typedef int arr[M][N]        //arr a;(int arr[M][N];)

       3>指针类型定义

       Typedef int *pointer         //pointer p;(int *p;)

       Typedef int *pointer[M]      //pointer p;(int *p[M];)

       4>函数声明

       Typedef int fun(void)        //fun f;(int f(void);)

       //fun *p;(int (*p)(void);)

       5>函数指针

       Typedef int (*func)(void)    //func p;(int (*p)(void);)

    Define

        在C或C++语言源程序中同意用一个标识符来表示一个字符串,称为“宏”。

       keyword使用的总结。

       1>无參宏定义

       其定义的一般形式为:#define 标识符 字符串 

        a.宏定义是用宏名来表示一个字符串。在宏展开时又以该字符串代替宏名,这仅仅是一 种简单的代换,字符串中能够含不论什么字符,能够是常数,也能够是表达式,预处理程序对 它不作不论什么检查。如有错误。仅仅能在编译已被宏展开后的源程序时发现。

       b.b. 宏定义不是说明或语句。在行末不必加分号。如加上分号则连分号也一起置换。

     

       2>带參宏定义

         带參宏定义的一般形式为: #define 宏名(形參表字符串 

      在宏定义中的參数称为形式參数,在宏调用中的參数称为实际參数。

    对带參数的宏,在调 用中。不仅要宏展开,并且要用实參去代换形參。 

       3>防止反复定义

       比如 

       #ifndef __headerfileXXX__ 

      #define __headerfileXXX__ 

       … 

       文件内容 

       … 

       #endif

  • 相关阅读:
    Database normalization
    字符串匹配算法之AhoCorasick
    Riak Compared to Neo4j
    Redis Proxy
    望江南
    How To Use The New Multivalue Field In Access 2007/2010 Sunday, June 19th, 2011
    FlockDB: Twitter's distributed, faulttolerant graph database
    Any 'pretty' data visualization libraries for Python?
    50 Great Examples of Data Visualization50 Great Examples of Data Visualization
    字符串匹配算法之AhoCorasick
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6800261.html
Copyright © 2011-2022 走看看