文章目录
- 第十二章:预处理命令
- 宏定义
- 无参宏定义
- 带参数的宏定义
- 文件包含处理
第十二章:预处理命令
-
作用:由编译预处理程序对程序中的特殊命令作出解释,以产生新的源程序对其进行正式编译
-
C语言与其他语言的重要区别就是可以使用预处理命令和具有预处理的功能
-
C提供的预处理功能主要有以下三种:
-
宏定义
#define A 30 //预处理时所有A以30替换
-
文件包含
#include <stdio.h> //预处理时以stdio.h中的实际内容替换
-
条件编译
-
-
所有编译预处理都以#开头,单独占源程序的一行,一般放在源程序首部,预处理命令不是C语句,行末不加分号(😉
宏定义
- 作用:用标识符来代表一串字符,编译系统在编译之前会将标识符换成字符串
- 宏定义包括两种:无参宏定义、有参宏定义
无参宏定义
-
定义:指用一个指定的标识符来代表一个字符串
-
一般形式:
#define 标识符 字符串 #define PI 3.14159 #define:宏定义命令 PI:宏名
-
宏展开:在预处理时将宏名替换成字符串的过程成为宏展开
-
说明
- 宏明习惯用于大写字母
- 宏定义不在末尾加分号
- 作用范围为定义之后到本源文件结束
- 用#undef终止宏定义的作用域,称为取消宏命令定义。定义格式:#undef 标识符
- 对程序中用双引号括起来的字符串内的字符,即使与宏名相同,也不进行置换
- 宏定义不同于变量,只做字符替换,不分配内存空间
带参数的宏定义
-
作用:不仅进行简单的字符串替换,还要进行参数替换
-
一般形式
#define 宏名(形参表) 字符串 #define S(a,b) a*b
-
带参宏定义的展开:按#define命令行中指定字符串从左到右进行置换。若串中包含形参,将程序中相应的实参代替形参,非参数字符保留
-
说明:
- 宏定义时,宏名与带参数的括号间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。
- 宏定义时,宏名与带参数的括号间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。
文件包含处理
-
定义:文件包含指将另外的文件包含到本文件之中,即一个源文件中可包含另外一个源文件的全部内容
-
一般形式
#include<文件名>或#include“文件名”
-
作用:使用文件包含可避免重复劳动,往往将常用的符号常量定义、函数原型声明、类型定义等组成一个文件,用 #include 命令将它添加到自己的源文件中
-
头文件内容可包括:函数原型定义、宏定义、全局变量定义、结构体类型定义等
-
一个include命令只能指定一个被包含文件
-
用<>、" "的区别:
- < >: 标准方式,系统直接按照标准目录搜索,这个标准目录由编译程序的用户定义
- “ ”:系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找
- 一般:调用库函数时用<>;调用自写函数时用" "