谈一谈define,枚举,const,内联

define

#define命令是C语言中的一个宏定义命令,它用来讲一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。该命令有两种格式:一种是简单的宏定义(不带参数的宏定义),另一种是带参数的宏定义。
格式:#define <宏名/标识符> <字符串>

eg:#define PI 3.1415926

说明:

①宏名一般用大写

②宏定义末尾不加分好;

③可以用#undef命令终止宏定义的作用域

④宏定义可以嵌套

⑤字符串“”中永远不包含宏

⑥宏替换在编译前进行,不分配内存,变量定义分配内存,函数调用在编译后程序运行时进行,并且分配内存

⑦预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查

⑧使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义

(2) 带参数的宏定义(除了一般的字符串替换,还要做参数代换)

格式:#define <宏名>(<参数表>) <字符串>

eg:#define S(a,b) a*b

area=S(3,2);

第一步被换为area=ab;第二步换为area=32;

一个标识符被宏定义后,该标识符便是一个宏名。这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。

使用带参数的宏定义可完成函数调用的功能,又能减少系统开销,提高运行效率。宏定义可完成简单的操作,但复杂的操作还是要由函数调用来完成,而且宏定义所占用的目标代码空间相对较大,在使用时要根据具体情况来看。

枚举

enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值,

enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};

需要注意的两点是:

  1. 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的,不能再定义与它们名字相同的变量。
  2. Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。

枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。

/* 定义枚举类型 */
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
void main()
{
/* 使用枚举类型声明变量,再对枚举型变量赋值 */
enum DAY yesterday, today, tomorrow;
yesterday = MON;
today = TUE;
tomorrow = WED;

枚举变量的大小

枚举类型在存储时,是按照int型存储的,在我的系统中也就是4字节方式存储

枚举与#define 宏的区别

1)#define 宏常量是在预编译阶段进行简单替换。枚举常量则是在编译的时候确定其值。所以枚举可以进行类型检查

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

3)枚举可以一次定义大量相关的常量,而#define 宏一次只能定义一个。

const

const是constant的简写,用来定义常量,它限定一个变量不允许被改变,产生静态作用。const最开始推出的目的是为了取代预编译指令,取长补短。

与define的对比
define是预编译指令,定义的宏是在预处理阶段展开的,而const是普通变量的定义,是只读变量,且是在编译运行阶段使用的。
define定义的是常量,define定义的宏在编译后消失了,它不占用内存,而const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元,除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便。
define定义的对象没有数据类型,编译器只能机械地进行字符替换,没有类型安全检查,即会出现“边际问题”或者是“括号问题”。而const定义的是变量,有数据类型。

如果一定要用全局变量,应该尽量的使用const进行修饰,防止不必要的人为修改,使用 const 修饰过的局部变量就有了静态特性,它的生存周期也是程序运行的整个过程,虽然有了静态特性,但并不是说它变成了静态变量。

const类对象只能调用const成员函数

内联

在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。
为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。
栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。。

关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

inline只是一种建议,真正用不用得靠编译器来决定,而且inline只适合涵数体内代码简单的函数数使用,不能包含复杂的结构控制语句例如while、switch,并且内联函数本身不能是直接递归函数。

内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。

内联函数是在编译时展开,而宏在预编译时展开;在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。
内联函数可以进行诸如类型安全检查、语句是否正确等编译功能,宏不具有这样的功能;宏不是函数,而inline是函数

你可能感兴趣的:(define,枚举,内联)