C语言编译预处理
一.预定义符号
二.#define
1.简单的替换 例:#define N 25 编译过程中,会将所有的N换成25
2.宏
(1)#define 宏名(参数列表) 内容
例:
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MALLOC(size, type) \ //如果不止1行,可以用 \ 连接
(type *)malloc(size * sizeof(type))
注意 宏是在编译前进行替换,和函数不同,如果代码中大量的使用宏,会造成代码的长度大幅增长;函数则是多次的调用同一段代码。 宏的优势 没有规定参数,使用更灵活;执行速度更快
(2) #undef name 移除一个宏定义
#define N 50
#undef N //取消宏定义
//如果出现x = N;这类语句,则会应为N未定义而报错
(3)命令行定义
int array[SIZE];//SIZE是一个宏名
在编译时,使用cc -DSIZE=100 filename.c命令可以指定被定义符号的值
三.条件编译
1. #if,#elif 和 #endif
#if 条件
语句
#elif 条件
语句
#endif
当满足条件时,语句才会被编译
2.是否被定义
#if defined(name) 等价于 #ifdef name被定义
#if !defined(name) 等价于 #ifndef name未被定义
四.文件包含
#include < filename >或者" filename " 规则很简单,就是将filename中的内容和这条语句替换
1.库文件包含 #include < filename >
2.文件包含 #include "路径/filename"
注意 尖括号中的文件被放在默认的include文件夹中,使用双引号可以给定路径来定位文件
3.避免多重包含
#include "a.h" //a.h包含了x.h
#include "b.h" //b.h包含了x.h
//这样x.h就被包含了两次
使用条件编译避免上述情况
头文件编写技巧
#ifndef FILENAMEH //为了不冲突,使用文件名
#define FILENAMEH 1 //这里的1可以省略,只是为了定义这个符号 ...
... (头文件内容)
#endif
这样在第一次定义之后,就会触发条件编译的条件,第二次就不会进行编译,有效的避免了多重包含
2019/3/3 0:59:45