导读
什么是预处理?预处理有什么用?怎么使用宏?
分类
宏定义
#define
#undef
文件包含
#include
条件编译
#if
#ifdef
#else
#elif
#endif
其他
#line
#error
#pragma
宏定义
不带参数的宏定义
宏的作用:定义一个标识符来代表一个字符串。
标识符称为宏名。
替换的过程称为宏替换。
宏替换的操作是在预编译时进行的。
格式
#define 标识符 单词串//标识符就是宏名,用于代替后面的单词串,单词串是宏体,以回车换行为结尾,一般不能用分号结尾。
注意
通常用大写字母来定义宏名,以便区别变量名
进行宏定义时,若单词串太长,需要多行时,可在行尾加上\反斜线换行符
如需终止宏的作用域,可以使用#undef
如
#define N 10//宏定义
…………
#undef N//宏取消
宏定义可以进行嵌套定义,但不能递归定义
双引号中的字符不能进行宏替换
宏可以重复定义
如果宏是一个表达式,需要用()括起来
带参数的宏定义
这样的宏因为定义成一个函数调用的形式,也称为类函数宏
格式
#define 标识符(参数列表) 单词串//宏和()之间不能有空白符
注
参数表由一个至多个参数构成,参数只有参数名,没有数据类型,参数之间用逗号隔开
文件包含
将另一个文件的全部内容包含进来
#include<包含文件名>
#include"包含文件名"//或者
可以将多个模块,多个文件集中到一个单独的文件中。
一条包含语句只能指定一个被包含文件
文件包含可以嵌套
条件编译
#if……#endif
#if 条件1
程序段1
#elif 条件2
程序段2
……
#else
程序段n
# endif
注意
#endif必须存在,他是#if的结尾
#elif可以有多个
#if 的条件可以不加()
defined命令
defined(宏名)
defined 宏名
判断某个宏是否定义,只能与#if与#elif配合使用,不能单独使用
#ifdef……#endif
#ifdef 宏名
程序段1
#elif
程序段2
……
#else
程序段n
# endif
#endif必须存在,他是#if的结尾
#elif可以有多个
#ifdef 宏名与#if defined(宏名)等价
#ifndef……#endif
#ifndef 宏名
程序段1
#elif
程序段2
……
#else
程序段n
# endif
区别 没有定义为程序段1,与上式相反