当前课程知识点:C语言程序设计 > 第10章 预处理命令 > 10.1 编译预处理 > 编译预处理
同学们大家好
之前大家在程序中都见过#include
这是C语言中的一种预处理命令
用来包含程序中所需要的头文件
在这一章中我们主要来讨论C语言的预处理命令
预处理命令是以#开头
以换行符结尾的行
他们不是C语言的语法成分
而是传给编译程序的各种指令
C语言的预处理命令包括
宏定义
文件包含
条件编译等
下面我们详细介绍这3中预处理命令
首先我们介绍宏定义
它包括不带参数的和带参数的宏定义
宏定义使用#define命令
指定一个标识符来代表一个字符串
在程序中如果发现这个标识符
就用这个字符串替换
不带参数的宏定义形式是这样的
#define 标识符 单词串
如#define SIZE 10 就是在源文件中如果出现大写size
就用10来替换
注意
如果10后面有个分号
那么在替换的时候就是把每个大写的size都用10分号来替换
所以宏定义中不能出现分号
下面介绍另一种宏定义
带参数的宏定义
一般形式是这样的
#define 标识符(参数列表) 字符串
如#define SQRT(X) (X*X) 在程序中遇到SQRT(3)
用(3*3)代替
如遇到SQRT(3+2)
注意是用(3+2*3+2)替换
而不是用(5*5)替换
如果想实现这个效果
需要更改宏定义的形式
将X左右两边加上括号
也就是这样
在进行替换的时候就会有括号
就会实现先运算3+2=5
再进行相乘的运算
由此可见宏定义不管带不带参数
只是简单的字符串的替换
下面我们介绍条件编译
一般情况下
源程序中的所有语句都要参加编译
有时也希望在一定条件下编译源文件的不同部分
这个时候就需要用到条件编译
比如下面的这种形式
和if else结构相似
满足条件时编译
不满足条件的不编译
条件编译还有另外一种形式
就是这样
也就是如果使用#define定义了宏名
就编译程序段1
否则编译程序段2
条件编译还有另外一种形式
是这样
这和前一种的区别就是
如果没有使用#define定义宏名
编译程序段1
否则编译程序段2
和前一种刚好相反
同学们学到这里
感觉条件编译和条件语句很相似
确实他们看起来很像
但有本质的区别
条件编译时将满足条件的程序代码进行编译生成目标代码
不满足条件的程序代码不进行编译
而条件语句不管是否满足条件都要编译生成目标代码
只是生成目标代码以后执行的时候
满足条件的语句执行
不满足条件的语句不执行
以上就是预处理这章的基本内容
谢谢大家的聆听
再见
-计算思维与计算机
--计算思维与计算机
--计算思维与计算机
--计算思维和计算机
-2.1 程序设计语言的发展及其特点和应用
--程序设计语言的特点及发展
- 2.2 C语言程序的基本结构及编制C语言程序的基本步骤
--C语言程序的结构和编制步骤
-3.1 C语言的数据类型
--C语言的数据类型
--C语言的数据类型
-3.2 常量
--常量
--常量
-3.3 什么是变量
--什么是变量
--什么是变量
-3.4 如何进行算术运算
--如何进行算术运算
--如何进行算术运算
-3.5 赋值运算符和逗号运算符
--赋值运算符和逗号运算符
-3.6 数据类型转换
--数据类型转换
--数据类型转换
-4.1 格式化输出printf
--格式化输出
-4.2 格式化输入scanf及字符数据的非格式化输入输出
--格式化输入
-5.1 关系运算符和关系表达式
--关系运算符和关系表达式
-5.2 逻辑运算符和逻辑表达式
--逻辑运算符和逻辑表达式
-5.3 条件运算符和条件表达式
--条件运算符和条件表达式
-5.4 if语句
--if语句
--if语句
-5.5 switch语句
--switch语句
--switch语句
-6.1 while语句
--while语句
--while语句
--do-while语句
-6.2 for语句
--for语句
--for语句
-6.3 循环的嵌套
--循环的嵌套
--循环的嵌套
-6.4 break语句和continue语句
--break和continue语句
-7.1 一维数组的定义和引用
--一维数组的定义和引用
-7.2 一维数组的赋值
--一维数组的赋值
--一维数组的赋值
-7.3 二维数组的定义和引用
--二维数组的定义和引用
-7.4 二维数组的赋值
--二维数组的赋值
--二维数组的赋值
-7.5 字符串的本质
--字符串的本质
--字符串的本质
-7.6 字符串操作的常用函数
--字符串常用函数
-7.7 字符串数组
--字符串数组
--字符串数组
-8.1 函数概述
--函数概述
--函数概述
-8.2 有参函数
--有参函数
--有参函数
-8.3 函数参数的传递方式
--函数参数的传递方式
-8.4 变量的作用域和生存期
--变量的作用域和生存期
-8.5 变量的存储类型
--变量的存储类型
--变量的存储类型
-8.6 函数的嵌套和递归调用
--函数的嵌套和递归调用
-8.7 函数的作用域与封装
--函数的作用域与封装
-9.1 指针变量的概念(上)
--指针变量的概念(上)
-9.2 指针变量的概念(下)
--指针变量的概念(下)
-9.3 指向一维数组的指针变量
--指向一维数组的指针变量
-9.4 指向二维数组的指针变量(上)
--指向二维数组的指针变量(上)
-9.5 指向二维数组的指针变量(下)
--指向二维数组的指针变量(下)
-9.6 动态内存分配
--动态内存分配
--动态内存分配
-10.1 编译预处理
--编译预处理
-11.1 用户自己建立数据类型
--用户自己建立数据类型
-11.2 定义结构体类型变量
--定义结构体类型变量
-11.3 结构体变量的引用与初始化
-11.4 结构体数组
--结构体数组
--结构体数组
-11.5 指向结构体类型数据的指针
--指向结构体类型数据的指针
-12.1 文件的基本概念和文件指针
--文件的基本概念和文件指针
-12,2 文件的打开和关闭
--文件的打开和关闭
--文件的打开和关闭
-12.3 文本文件读写
--文本文件读写
--文本文件读写
-12.4 二进制文件读写
--二进制文件读写
--二进制文件读写