编译预处理

来源:互联网 发布:交流软件英文怎么说 编辑:程序博客网 时间:2024/06/08 10:51

1.      宏定义指令

1)        定义变量与命令(避免幻数)

在宏定义命名时,尽量能清楚的表明功能,大写(不能以__开头易与内置宏冲突)

2)        定义宏函数

#define MAX(a, b) a >b ? a : b

int num = MAX(6, 5);à6 > 5 ? 6 : 5

用编译时间换内存空间的是宏函数

用内存空间换运行空间的是内敛(内嵌)函数

3)        自定义函数与宏函数的区别

宏函数省去了分配、释放栈帧,传参、传返回值等一系列工作,效率更高;但宏函数不做语法检查,不安全,且实现不了复杂的功能。

自定义函数更安全,但效率低。

4)        内置宏定义

__LINE__    显示行号

__func__    显示函数名

__TIME__    显示时间

__DATA__    显示日期

5)        typedef与#define的区别

执行时间不同

关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。

#define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。

功能有差异

typedef用来定义类型的别名,定义与平台无关的数据类型,与struct的结合使用等。

#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

作用域不同

#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。

typedef有自己的作用域。

6)        枚举与#define的区别

l 枚举常量是实体中的一种,但宏不是实体;

l 枚举常量属于常量,但宏不是常量;

l 枚举常量具有类型,但宏没有类型,枚举变量具有与普通变量相同的诸如作用域、值等性质,但宏没有,宏不是语言的一部分,它是一种预处理替换符。枚举类型主要用于限制性输入,例如,某个函数的某参数只接受某种类型中的有限个数值,除此之外的其它数值都不接受,这时候枚举能很好地解决这个问题。能用枚举尽量用枚举,否则在调试的时候你是看不到当时的值的。

l 用宏去定义一个变量如果你定义了一个相同的变量那么要看谁在前面,如果宏在前面变量会产生编译错误,而且这个错误很难查找,如果那个宏隐藏的很深的话。如果你定义的变量在前那么更可怕了,直接没有错误,但是宏定义被自定义的变量悄悄替换了。用枚举定义的话不管你定义的顺序前后关系怎样都会产生重复定义的错误。从上面的举例来看枚举比宏好用的多。宏还有一个特性是没有作用域,这里的作用域是指宏定义以后的代码都可以使用这个宏。宏可以被重复定义这个可能导致宏的值被修改。所以建议不要用宏去定义整形的变量,用枚举或者const。又会有用const还是枚举呢,世界一向如此纠结,枚举只能表示整形,const可以修饰任何类型。整形的情况下如果你要定义几种有关系的数值那么用枚举,否则用const。

2.      条件编译指令

#ifdef、#ifndef、#endif

防止头文件重复包含带来的重复定义

#ifdef、#ifndef主要用于防止重复包含。我们一般在.h头文件前面加上这么一段:

//头文件防止重复包含

//funcA.h

#ifndef FUNCA_H

#define FUNCA_H

//头文件内容

#end if

这样,如果a.h包含了funcA.h,b.h包含了a.h、funcA.h,重复包含,会出现一些type redefination之类的错误。

#if defined等价于#ifdef; #if !defined等价于#ifndef


0 0
原创粉丝点击