C语言 预处理

C 语言允许预处理指令,并且会在编译之前对他们进行转换和处理。

一、define

1.不带参数的宏定义

1
#define 标识符 字符串

它的作用是,将程序中出现的标识符都用字符串替代。

例如:

1
#define PI (3.14)

这样便可以在代码中用 PI 代表 3.14 ,且代码中所有的 PI 都可以通过修改宏定义很方便地统一修改。

2.带参数的宏定义

1
#define 宏名(参数表) 字符串

它的作用是,将程序中出现的**宏名(参数表)**用字符串替换,并把程序中出现的参数填入对应位置。

3.注意事项

在使用 #define 时,最好给每一个数字加上括号,可以防止出错,避免很多麻烦。因为符号变量会被粗暴地直接替换。

例如:

1
2
3
#define add(x, y)   x + y

num = add(x, y) * 3;

预想结果:

1
num = (x + y) * 3;

实际结果:

1
num = x + y * 3;

所以更好的做法是:给每一个位置和整体都加上括号

1
#define add( x ,  y )   ((x)  +  (y))

二、include

1.include 的使用

1
#include <文件名>

2.“ ” 和 < >

< > 会要求编译器直接去指定目录寻找文件。

“ ” 会要求编译器首先在当前目录查找为了见,如果没有,再到编译器指定目录寻找。

3.注意事项

  • include 是一个编译预处理指令,会在编译之前处理
  • include 指令实际上是将文件中的内容复制过来
  • 使用库函数时,需要先 include 相应头文件

三、条件编译

1.

1
2
3
4
5
#ifdef 标识符
程序段1
#else
程序段2
#endif

它的作用是:若指定的标识符已经被定义过,则编译程序段1,否则编译程序段2

2.

1
2
3
4
5
#ifndef 标识符
程序段1
#else
程序段2
#endif

它的作用是:若指定的标识符未被定义过,则编译程序段1,否则编译程序段2

3.

1
2
3
4
5
#if 表达式
程序段1
#else
程序段2
#endif

它的作用是:当指定条件为真时,就编译程序段1,否则编译程序段2

参考