当前课程知识点:C语言程序设计 >  第10章 预处理命令 >  10.1 编译预处理 >  编译预处理

返回《C语言程序设计》慕课在线视频课程列表

编译预处理在线视频

下一节:用户自己建立数据类型

返回《C语言程序设计》慕课在线视频列表

编译预处理课程教案、知识点、字幕

同学们大家好

之前大家在程序中都见过#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

和前一种刚好相反

同学们学到这里

感觉条件编译和条件语句很相似

确实他们看起来很像

但有本质的区别

条件编译时将满足条件的程序代码进行编译生成目标代码

不满足条件的程序代码不进行编译

而条件语句不管是否满足条件都要编译生成目标代码

只是生成目标代码以后执行的时候

满足条件的语句执行

不满足条件的语句不执行

以上就是预处理这章的基本内容

谢谢大家的聆听

再见

C语言程序设计课程列表:

第1章 C语言程序设计预备知识

-计算思维与计算机

--计算思维与计算机

--计算思维与计算机

--计算思维和计算机

第2章 C语言程序设计基础

-2.1 程序设计语言的发展及其特点和应用

--程序设计语言的发展及其特点和应用

--程序设计语言的特点及发展

- 2.2 C语言程序的基本结构及编制C语言程序的基本步骤

-- C语言程序的基本结构及编制C语言程序的基本步骤

--C语言程序的结构和编制步骤

第3章 基本数据类型、运算符与表达式

-3.1 C语言的数据类型

--C语言的数据类型

--C语言的数据类型

-3.2 常量

--常量

--常量

-3.3 什么是变量

--什么是变量

--什么是变量

-3.4 如何进行算术运算

--如何进行算术运算

--如何进行算术运算

-3.5 赋值运算符和逗号运算符

--赋值运算符和逗号运算符

--赋值运算符和逗号运算符

-3.6 数据类型转换

--数据类型转换

--数据类型转换

第4章 基本输入输出和顺序程序设计

-4.1 格式化输出printf

--格式化输出printf

--格式化输出

-4.2 格式化输入scanf及字符数据的非格式化输入输出

--格式化输入scanf及字符数据的非格式化输入输出

--格式化输入

第5章 选择结构程序设计

-5.1 关系运算符和关系表达式

--关系运算符和关系表达式

--关系运算符和关系表达式

-5.2 逻辑运算符和逻辑表达式

--逻辑运算符和逻辑表达式

--逻辑运算符和逻辑表达式

-5.3 条件运算符和条件表达式

--条件运算符和条件表达式

--条件运算符和条件表达式

-5.4 if语句

--if语句

--if语句

-5.5 switch语句

--switch语句

--switch语句

第6章 循环结构程序设计

-6.1 while语句

--while语句

--while语句

--do-while语句

-6.2 for语句

--for语句

--for语句

-6.3 循环的嵌套

--循环的嵌套

--循环的嵌套

-6.4 break语句和continue语句

--break语句和continue语句

--break和continue语句

第7章 数组

-7.1 一维数组的定义和引用

--一维数组的定义和引用

--一维数组的定义和引用

-7.2 一维数组的赋值

--一维数组的赋值

--一维数组的赋值

-7.3 二维数组的定义和引用

--二维数组的定义和引用

--二维数组的定义和引用

-7.4 二维数组的赋值

--二维数组的赋值

--二维数组的赋值

-7.5 字符串的本质

--字符串的本质

--字符串的本质

-7.6 字符串操作的常用函数

--字符串操作的常用函数

--字符串常用函数

-7.7 字符串数组

--字符串数组

--字符串数组

第8章 函数

-8.1 函数概述

--函数概述

--函数概述

-8.2 有参函数

--有参函数

--有参函数

-8.3 函数参数的传递方式

--函数参数的传递形式

--函数参数的传递方式

-8.4 变量的作用域和生存期

--变量的作用域和生存期

--变量的作用域和生存期

-8.5 变量的存储类型

--变量的存储类型

--变量的存储类型

-8.6 函数的嵌套和递归调用

--函数的嵌套和递归调用

--函数的嵌套和递归调用

-8.7 函数的作用域与封装

--函数的作用域与封装

--函数的作用域与封装

第9章 指针

-9.1 指针变量的概念(上)

--指针变量的概念(上)

--指针变量的概念(上)

-9.2 指针变量的概念(下)

--指针变量的概念(下)

--指针变量的概念(下)

-9.3 指向一维数组的指针变量

--指向一维数组的指针变量

--指向一维数组的指针变量

-9.4 指向二维数组的指针变量(上)

--指向二维数组的指针变量

--指向二维数组的指针变量(上)

-9.5 指向二维数组的指针变量(下)

--指向二维数组的指针变量(下)

--指向二维数组的指针变量(下)

-9.6 动态内存分配

--动态内存分配

--动态内存分配

第10章 预处理命令

-10.1 编译预处理

--编译预处理

第11章 复杂数据类型

-11.1 用户自己建立数据类型

--用户自己建立数据类型

--用户自己建立数据类型

-11.2 定义结构体类型变量

--定义结构体类型变量

--定义结构体类型变量

-11.3 结构体变量的引用与初始化

--结构体变量的引用与初始化

-11.4 结构体数组

--结构体数组

--结构体数组

-11.5 指向结构体类型数据的指针

--指向结构体类型数据的指针

--指向结构体类型数据的指针

第12章 文件

-12.1 文件的基本概念和文件指针

--文件的基本概念和文件指针

--文件的基本概念和文件指针

-12,2 文件的打开和关闭

--文件的打开和关闭

--文件的打开和关闭

-12.3 文本文件读写

--文本文件读写

--文本文件读写

-12.4 二进制文件读写

--二进制文件读写

--二进制文件读写

编译预处理笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。