您的位置:首页 > 其它

关键字、结构体总结以及typedef,枚举与#define区别

2016-07-23 21:50 260 查看
关键字
register关键字
1、作用:请求编译器尽量将变量保存在CPU内部寄存器里,可以省去CPU从内存中抓取数据的时间,从而提高运行效率
2、我们可以将频繁使用的变量修饰为register变量
3、register使用注意点:①register只能修饰局部变量,不能修饰全局变量(因为全局变量被多个进程访问,如果当前进程将变量修饰为register,其他进程去不知道,从而不能修饰局部变量)
 ②不能用&来获取一个register修饰变量的地址  ③register修饰变量一定是一个CPU所接受的数据类型
 
static关键字
static可以修饰变量和函数。修饰函数时,表明这个函数只可以在本文件内调用,不能在其他文件中调用,其修饰变量时可修饰局部变量和全局变量。修饰局部变量的时候,可延长局部变量的生命周期,到程序运行结束后释放,修饰全局变量时,这个变量只可在本文件可见,其它文件不可调用
 
extern关键字
外部声明(需要标注变量的类型),这个变量一般在另一个文件中,extern一般用来修饰全局变量或者函数
 
const关键字
const修饰的变量称为只读变量,修饰一个变量代表其空间是可变的,不能通过变量名修改变量的值。Const修饰时要对变量进行初始化
  
typedef
对一个数据类型进行改名字操作,可提高代码的移植性,可把复杂类型变成简单的类型,或者起到注释的作用
 
结构体
作用:封装数据,把不同的数据类型封装到一起
数组名用:strcpy(stu.name,”zhansan”)
结构体指针用->



宏:用来避免出现幻数,注意定义是能清晰的表明其用途(预处理阶段)
函数式宏定义=宏函数
自定义函数与和宏函数区别:宏定义省去了分配和释放栈帧,传参,传返回值等工作,但宏函数不安全,宏定义不做语法检查(宏函数用编译时间换内存空间)
 
用内存空间来换运行时间的例子:inline(只能修饰函数)为内敛函数
条件编译:防止头文件重复包含带来的重复定义
 
浮点型的赋值:if(x>=EPSINON)&&(x<=EPSINON)  EPSINON为允许的误差
指针的赋值:if(p==NULL)
死循环:while(1)
for( ; ; )
switch case注意break
和default一定要写,其匹配的类型为整型和字符
 
内存空洞:注意要将相同的数据类型放到一起



typedef与#define的区别:
为了尽可能地兼容,一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗长的类型的别名。typedef故名思意就是类型定义的意思,但是它并不是定义一个新的类型而是给已有的类型起一个别名,在这一点上与引用的含义类似,引用是变量或对象的别名,而typedef定义的是类型的别名
宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变
量的功能

1、执行时间不同

关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。
#define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。

2、 功能有差异

typedef用来定义类型的别名,定义与平台无关的数据类型,与struct的结合使用等。
#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
 3、 作用域不同
#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。
而typedef有自己的作用域。
 
枚举与#define区别
1)#define 宏常量是在预编译阶段进行简单替换。枚举常量则是在编译的时候确定其值。

2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量。

3)枚举可以一次定义大量相关的常量,而#define
宏一次只能定义一个
4)从数据的类型看:#define可以编译任意类型的常量,而枚举只能是定义整型常量。

5)从可维护性来看:枚举可以集中管理数据,具相同属性的整形数据可使用枚举,枚举可实现取值的自增,也可指定每个枚举的值,编写代码跟容易,相对来说能减少出错的机会,也便于代码的后期维护和修改。

 

 volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: