【C语言 C++】简单关键字Register,Const,Static,Volatile,typedef,Define的理解

原创 2015年07月09日 14:42:54

Register

    用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器 中;但对32位编译器不起作用,当global optimizations(全局优化)开的时候,它会做出 选择是否放在自己的寄存器中;不过其它与register关键字有关的其它符号都对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成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修 改对象

Static

   1>修饰变量

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

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

    2>修饰函数

    函数前加static 使得函数成为静态函数。但此处“static”的含义不是指存储方式, 而是 指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不 同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

Volatile

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

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++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。

   关键字使用的总结。

   1>无参宏定义

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

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

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

   2>带参宏定义

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

  在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调 用中,不仅要宏展开,而且要用实参去代换形参。 

   3>防止重复定义

   例如 

   #ifndef __headerfileXXX__ 

  #define __headerfileXXX__ 

   … 

   文件内容 

   … 

   #endif

版权声明:本文为博主原创文章,未经博主允许不得转载。

常见的typedef、define、const、static使用辨析

define用法: #define为预处理命令,定义的实质:只是为后面的常量定义一个别名。该声明的结果没有具体类型,不分配内存空间。在编译时,用到别名的地方,编译器会自动把该别名替换为相应常量。每次...
  • u012160319
  • u012160319
  • 2015年01月14日 16:07
  • 877

C语言中关键字const、static、volatile的用法分析

const 作为一个程序员,我们看到关键字”const”时,首先想到的应该是”只读”。因为,它要求其所修饰的对象为常量,不可对其修改和二次赋值操作(不能作为左值出现)。看几个例子: co...
  • yayawy
  • yayawy
  • 2016年05月16日 16:07
  • 4037

c语言之volatile和register关键字

//register.cpp #include #include #include int main1() { for(register int i=0;i
  • earbao
  • earbao
  • 2016年12月28日 00:10
  • 1140

struct,typedef,volatile,const,static

1.static关键字 这个关键字前面也有提到,它的作用是强大的。 要对static关键字深入了解,首先需要掌握标准C程序的组成。 标准C程序一直由下列部分组成:       ...
  • liu727147794
  • liu727147794
  • 2014年11月06日 00:28
  • 498

C语言关键字static和volatile 的含义和作用

C语言关键字static和volatile 的含义和作用
  • qq_40646385
  • qq_40646385
  • 2017年10月19日 15:43
  • 146

关键字:register static extern const typedef volatile

关键字 register关键字是用来请求编译器尽可能将变量的值保存在CPU内部寄存器中,这样省去了CPU从内存中抓取数据的时间,从而提高程序的运行效率。 尽可能:CPU内部寄存器的内存有限,不可能把...
  • qq_31108501
  • qq_31108501
  • 2016年07月25日 14:23
  • 175

register,static,extern,const,typedef,volatile关键字

一.register 用register修饰的作用: 请求编译器尽可能(CPU寄存器资源有限)将变量的值保存在CPU内部寄存器中,省去了CPU从内存中抓取数据的时间,提高了程序的运行效率。 ...
  • qq_35212671
  • qq_35212671
  • 2016年07月27日 19:42
  • 137

const与#define宏定义的区别——C语言深度剖析

const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝。#define宏是在预编译阶段进行替换,而const修饰...
  • lovey_carolin
  • lovey_carolin
  • 2011年04月07日 15:52
  • 4525

C++带const、static和#define关键字的变量定义的区别

一、const  1.变量定义中    (1)const int a=10;    说明:定义的int型变量a不能被修改,只能被使用。带const关键字的变量可以定义为全局变量,但此时定义的全局...
  • xingkongfenqi
  • xingkongfenqi
  • 2015年07月04日 21:35
  • 1369

C语言中 关于const和#define的区别心得

尽量用const和inline而不用#define 这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好像不是语言本身的一部分。这是问题之一。再看下面的语句: #defin...
  • wangjun_huster
  • wangjun_huster
  • 2017年04月09日 14:44
  • 247
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言 C++】简单关键字Register,Const,Static,Volatile,typedef,Define的理解
举报原因:
原因补充:

(最多只允许输入30个字)