之前的笔记搬运
预处理是什么?
预处理是指在编译前对代码的以一些替换操作, 以” # ” 开头的都是预处理指令,
预处理指令可以定义到任意行, 作用域是指令的下一行至代码尾部或 “ #undef ” ,
每个编译器有会有独特的预处理指令
什么是宏预处理?
宏宇处理也称宏定义, 作用就是把定义一个标识符来表示一个字符串,
标识符就是宏名,在编译预处理中,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。
宏定义的分类
无参宏定义: #define X(标识符) XXXXX(用于替换的代码)
无参宏可以定义一个标识符来代替一些重复使用并可能随时更改的代码,
这样就可以通过修改宏定义来达到修改所有替换代码的目的, 或定义空宏用于注释,
增加代码的可读性
有参宏定义: #define X(a,b)(标识符和参数) a+b(带参数替换代码)
有参宏可以定义一个标识符, 并且可以传递参数来达到运算的目的,
不过需要注意定义时必须严格检查参数的类型, 并且参与预算的变量,
必须全部带上括号来确定优先级, 否则可能导致编译通过, 运算结果却有误, 很难调试.
条件宏: #ifdef(如果定义了) #else (否则) #endif(结束最近的if)
#ifndef(如果未定义)
条件宏一般用于防止重复包含和控制调试输出信息
内置宏: _XXXX_
内置宏可以得到文件的一些基本信息, 如: _DEBUG_ (是否是调试版本)
_date_ (生成日期) 等
特殊宏指令: #
使用” # ”代表后面的代码按照字符串处理, 如 n1, 加上#n1, 就是”n1”
使用” ## ”表示把前面和后面的代码连接起来, 如 n1##n2, 就是n1n2,
如: #n1##n2, 就是”n1”n2, n1###n2, 就是n1”n2”
如何查看宏替换后的源码?
在编译命令中加上 “/P” 的指令, 就可以只预处理不编译, 并且在工程目录下生成 “ .i
”的文件, 这个就是预处理后的文件
函数和宏有什么区别?
函数: 效率慢, 代码可重复利用, 节省空间
宏: 效率快, 但是每次调用代码就会增加一次代码和变量的空间, 占用空间大
1.宏名标识符与左圆括号之间不允许有空白符,应该紧接在一起 如#define
Max(A,B)[对]与define Max (A,B)[错]
2.宏与函数的区别, 函数分配额外的堆栈空间, 而宏只是替换, 不会进入到新的子程序
3.为了避免出错,宏定义中给形参加上括号
4.末尾不需要分号
5.define可以替换多行代码,记得后面加\
如: #define MALLOC(n,type)\
((type*)malloc((n)*sizeof(type)))
包括预处理: #include 头文件
include就是把头文件里的代码, 复制替换到include这句代码的位置
头文件里为什么都是函数声明和全局变量申明?
因为可以有效的防止重复包含, 因为声明可以多次, 而定义就不可以,
值得注意的是结构体是没有声明的, 所以如果头文件中有结构体,
有多次包含是肯定会报错的