#define简单定义
#define指令被称为宏定义,在C程序编译的第一个步骤预处理阶段被编译,其作用就是替换任意文本。
它的最简单的用法,用来定义数值宏常量
#define PI 3.14
在这条指令之后出现的任何字符 PI 都会被预处理器替换为 3.14。
比如说下面这条指令
C = 2 * PI * 10;
编译器在处理这条代码之前,会先把 PI 替换成 3.14 然后在计算 2 * 3.14 *10 得 62.8 再赋值给变量C。
在你需要修改圆周率 3.14 的精度的情况下,则只需要改宏定义 PI 后的值就可实现全部都更改,不用一个一个地去改,这一点在你用了很多的圆周率3.14的时候更有效,前提是在使用圆周率 3.14 的时候都用PI来写;
#define函数定义
#define 还可以用来定义函数
比如定义无参宏函数
#define PRINT printf("hello world")
定义有参宏函数
#define P(s) printf("%d", s);
宏函数的优点是节省空间,不用给形参分配空间,缺点是会浪费时间(编译预处理阶段),没有语法检查,不安全
相对的,普通函数的优点是有语法检查,缺点是占用了空间。
#define表达式定义
在用#define定义表达式很容易出错,尤其是带参表达式,比如
#define MULT(a,b) a * b
假设 a = 1, b = 2, MULT(a, b)所得结果为 2,这应该都没问题。
但如果 a = 1 + 1,b = 2,MULT(a, b)所得结果不是4,应该是3。前面说过#define起到的是替换作用,所以最后的表达式应该替换为 1 + 1 * 2,所得结果为3。 遇到这种情况,其实只要多加括号就行,
#define MULT(a,b) ((a) * (b))
里层外层的括号都要,不要吝啬。
#define字符串定义
在编写C程序中,我们经常要敲好多字符串,尤其是路径,一个个改太费时费力,还容易出错,用define可以完美解决这个问题
#define MAIL hongdingyi@163.com
#define IP 172.172.0.0
#define PATH E:\\local\\music\\music.mp3
#undef取消宏定义
#undef是用来取消宏定义的
#define PI 3.14
.
.
.
#undef PI
#undef 后的代码再用 PI 就不会再替换为3.14了。
关于#define中的空格怎么处理
使用#define进行宏定义的时候常常会用到空格,下面我们来看看该怎么处理
#define FUN(x) x * x
#define FUN2 (x) x * x
#define FUN3( x ) x * x
FUN(1)
FUN2(2)
FUN3(3)
上述代码经过预处理后的结果为
1 * 1
(x) x * x(2)
3 * 3
可见在#define宏定义中,遇到的除了括号'()'内部的第一个空格,就把空格前的内容替换为空格后面的内容。
在进行宏定义的时候可以使用反斜杠接续符 ' \ ' ,来接续上一行,反斜杠作为接续符时,在本行其后面不能再有任何字符,空格都不行。