C语言#define的用法整理

#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 [email protected]
#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宏定义中,遇到的除了括号'()'内部的第一个空格,就把空格前的内容替换为空格后面的内容。

在进行宏定义的时候可以使用反斜杠接续符 ' \ ' ,来接续上一行,反斜杠作为接续符时,在本行其后面不能再有任何字符,空格都不行。

参考博客:http://www.cnblogs.com/haore147/p/3646934.html

猜你喜欢

转载自blog.csdn.net/qq_42379345/article/details/81226476