1.预处理指令的分类
1)。文件包含指令 #include
2)宏定义:可以将1段C代码定义为1个标识,使用这个标识就可以使用这段代码3),条件编译指令: 只编译指定的C代码为二进制指令
2,宏定义
1)。它是1个预处理指令.所以它在编译之前执行,
2),作用: 可以为1段C代码定义1个标识.如果你要使用这段C代码。那么你就使用。
3)。 语法:
#define 宏名 宏值
#define N 10
4),如何使用宏
在C代码中.直接使用宏的名称就可以了。
int a = N + 1;
5),宏的原理
在预编译的时候,就会执行源文件中的预处理指令,会将C代码中使用宏名的地方替换为宏值
将C代码中的宏名替换为宏值的过程叫做宏替换/宏代换
3. 在使用宏的时候需要注意的地方
1),宏值可以是任意的东东,宏值可以是任意的东西,在定义宏的时候,并不会去检查语法
2)。无论宏值是什么东西,在定义宏的时候,不会去检查语法只有当完成了宏替换的时候,才会去检查替换以后,是否符合语法规范
3),如果宏值是1个表达式,那么宏值并不是这个表达式的结果,而是这个表达式本身
Show the Debug area
4)。如果宏值中包括1个变量名,那么在使用这个宏之前必须要保证这个变量已经存在
5),无法通过赋值符号为宏 改值,因为宏根本就不是变量
6)。宏的作用域
a,宏可以定义在函数的内部 也可以定义在函数的外部
从定义宏的地方,后面的所有的地方都可以直接使用这个宏就算这个宏定义在这个大括弧里面,在这个后面 哪怕是大括弧外面都可以访问
默认情况下,宏从定义的地方一直到文件结束都可以使用
#undef 宏名
可以让指定的
7),字符串中如果出现了宏名,系统不会认为这是1个宏,而认为是字符串的一部分字符串中并不会出现宏替换,
8),宏的层层替换
宏值当中我们用到了另外1个宏名。那么就会先将这个宏值当中的宏名替换为对应的宏值
9),如果后面跟了分号.那么就会吧分号作为宏值的一部分,替换的时候连分号一起。虽然可以,但是不建议你加分
4.#define 和 typedef 的区别
1).#define是1个预处理指令.在预编译的时候执行,在预编译的时候会吧宏名换成宏typedef 是1个C代码,在运行的时候才会执行
2)#define 可以将任意的C代码取1个标识名typedef只能为数据类型取名字,
5.使用带参数几点注意
1),宏不是函数,所以宏的参数不需要加类型说明符,直接写参数名就可以了2),我们在定义宏的时候,编译器是如何区分宏名和宏值
#define 空格 宏名 空格
第1个空格和第2个空格之间的内容会作为宏名第2个空格以后的内容会作为宏值
所以.在写宏的时候,空格要小心了
3),为带参数的宏传值的时候,是本色传递
如果传递1个变量,并不是传递这个变的值而是直接传递的就是这个变量的串
5.宏一定程度上可以实现和函数一样的效果
1)宏值一旦换行,就任何宏定义结束了,所以你打算使用宏去替换函数的话,那么些的很恶心2),只有当函数的代码很少的时候,只有几句的时候,就可以使用宏
3)。代码多的情况下,还是建议作用函数
6.条件编译指令
1)。它是1个预处理指令,所以在预编译阶段执行.
2)。作用:
默认的情况下,我们所有的C代码都会被编译为二进制代码条件编译指令的作用: 可以让编译器只编译指定部分的代码
7,条件编译指令的第一种用法
#if 条件
C代码;
#endif
在预编译的时候,如果条件成立,就会将其中的C代码编译成二进制指令如果条件不成立.就不会将其中的C代码编译成二进制指令
注意:条件只能是宏 不能是变量
条件编译指令的第二种用法
#if 条件
C代码;
#elif 条件
C代码;
#elif 条件
C代码
#else
c代码
#endif
条件编译指令的第三种用法
#ifdef 宏名
C代码;
#endif
如果定义了指定的宏.就编译其中的代码否则就算了.
8,条件编译指令和if语句的1个对比
1).条件编译指令是1个预处理指令.在预处理阶段执行if语句是C代码,在程序运行的时候执行.
2)if语句无论如何全部都要被编译为二进制指令条件编译指令: 只会讲符合条件的C代码编译为二进制指令
3),实际上if语句一定程度上可以换成条件编译指令但是,条件编译指令的条件只能是宏。
9.
1)实现的效果
无论1个文件被#include多少次,我只希望他最终只会被包含1次
2),解决方案
文件。
#ifndef 宏名
#define 宏名
代码;
#endif