编译预处理
C 程序设计中的编译预处理是一项重要的功能,包括了宏和文件包含两个主要部分。宏在C 源程序中,可以使用宏来代表一个字符串,称为"宏"。在编译预处理阶段,所有出现的"宏名"都会被替换为宏定义中的字符
C 程序设计中的编译预处理是一项重要的功能,包括了宏和文件包含两个主要部分。
宏
在C 源程序中,可以使用宏来代表一个字符串,称为"宏"。在编译预处理阶段,所有出现的"宏名"都会被替换为宏定义中的字符串,这个过程称为"宏代换"或者"宏展开"。
无参宏的宏名后面不带参数。一般的宏定义形式如下:
```
#define 标识符 字符串
```
使用无参宏定义需要注意以下几点:
1. 宏定义只是一种简单的文本替换,字符串中可以包含任何字符,预处理程序对其不做任何检查。
2. 宏定义不是说明或语句,在行末不要加分号,如果加上分号,则连分号也会被替换。
3. 宏定义必须写在函数之外,其作用域从宏定义命令到源程序结束。
4. 如果在源程序中将宏名用引号括起来,则预处理程序不会对其进行宏代换。
5. 宏定义允许嵌套,可以在宏定义的字符串中使用已经定义的宏名。
文件包含
文件包含命令的功能是将指定的文件插入到当前命令行的位置,取代该命令行,从而将指定的文件和当前的源程序文件连接成一个源文件。
文件包含的一般形式如下:
```
#include "文件名"
```
使用文件包含需要注意以下几点:
1. 使用尖括号表示在系统目录中查找被包含的文件,而不在源文件目录中查找;使用双引号则表示首先在当前的源文件目录中查找,若未找到才到系统目录中查找。
2. 一个include命令只能指定一个被包含的文件。
3. 文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。
#ifdef条件
如果标识符已经通过#define命令进行了定义,则对程序段1进行编译;否则对程序段2进行编译。一般形式如下:
```
#ifdef 标识符
程序段1
#else
程序段2
#endif
```
#ifndef条件
如果标识符没有通过#define命令进行定义,则对程序段1进行编译;否则对程序段2进行编译。一般形式如下:
```
#ifndef 标识符
程序段1
#else
程序段2
#endif
```
#if条件
如果常量表达式的值为真(非0),则对程序段1进行编译;否则对程序段2进行编译。一般形式如下:
```
#if 常量表达式
程序段1
#else
程序段2
#endif
```