C语言预编译处理

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

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/88084056