预处理命令
- 格式:pptx
- 大小:639.82 KB
- 文档页数:70


第六章 预处理命令 ·1·
第六章 预处理命令
6.1 选择题
1. 下面叙述中正确的是( )。
A. 带参数的宏定义中参数是没有类型的
B. 宏展开将占用程序的运行时间
C. 宏定义命令是C语言中的一种特殊语句
D. 使用#include命令包含的头文件必须以“.h”为后缀
2. 下面叙述中正确的是( )。
A. 宏定义是C语句,所以要在行末加分号
B. 可以使用#undef命令来终止宏定义的作用域
C. 在进行宏定义时,宏定义不能层层嵌套
D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换
3. 在“文件包含”预处理语句中,当#include后面的文件名用双引号括起时,寻找被包含文件的方式为( )。
A. 直接按系统设定的标准方式搜索目录
B. 先在源程序所在目录搜索,若找不到,再按系统设定的标准方式搜索
C. 仅仅搜索源程序所在目录
D. 仅仅搜索当前目录
4. 下面叙述中不正确的是( )。
A. 函数调用时,先求出实参表达式,然后带入形参。而使用带参的宏只是进行简单的字符替换
B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在展开时也要分配内存单元,进行值传递
C. 对于函数中的实参和形参都要定义类型,二者的类型要求一致,而宏不存在类型问题,宏没有类型
D. 调用函数只可得到一个返回值,而用宏可以设法得到几个结果
5. 下面叙述中不正确的是( )。
A. 使用宏的次数较多时,宏展开后源程序长度增长。而函数调用不会使源程序变长
B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在展开时不分配内存单元,不进行值传递
C. 宏替换占用编译时间
D. 函数调用占用编译时间
第六部分 预处理命令 ·1·
第六部分 预处理命令
6.1 选择题
1. 下面叙述中正确的是( )。
A. 带参数的宏定义中参数是没有类型的
B. 宏展开将占用程序的运行时间
C. 宏定义命令是C语言中的一种特殊语句
D. 使用#include命令包含的头文件必须以“.h”为后缀
2. 下面叙述中正确的是( )。
A. 宏定义是C语句,所以要在行末加分号
B. 可以使用#undef命令来终止宏定义的作用域
C. 在进行宏定义时,宏定义不能层层嵌套
D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换
3. 在“文件包含”预处理语句中,当#include后面的文件名用双引号括起时,寻找被包含文件的方式为( )。
A. 直接按系统设定的标准方式搜索目录
B. 先在源程序所在目录搜索,若找不到,再按系统设定的标准方式搜索
C. 仅仅搜索源程序所在目录
D. 仅仅搜索当前目录
4. 下面叙述中不正确的是( )。
A. 函数调用时,先求出实参表达式,然后带入形参。而使用带参的宏只是进行简单的字符替换
B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在展开时也要分配内存单元,进行值传递
C. 对于函数中的实参和形参都要定义类型,二者的类型要求一致,而宏不存在类型问题,宏没有类型
D. 调用函数只可得到一个返回值,而用宏可以设法得到几个结果
5. 下面叙述中不正确的是( )。
A. 使用宏的次数较多时,宏展开后源程序长度增长。而函数调用不会使源程序变长
B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在展开时不分配内存单元,不进行值传递
C. 宏替换占用编译时间
D. 函数调用占用编译时间
6. 下面叙述中正确的是( )。
A. 可以把define和if定义为用户标识符
C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)
预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。
在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。
预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令:
指令用途
#空指令,无任何效果
#include包含一个源代码文件
#define定义宏
#undef取消已定义的宏
#if如果给定条件为真,则编译下面代码
#ifdef如果宏已经定义,则编译下面代码
#ifndef如果宏没有定义,则编译下面代码
#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif结束一个#if……#else条件编译块
#error停止编译并显示错误信息
一、文件包含
#include预处理指令的作用是在指令处展开被包含的文件。包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。标准C编译器至少支持八重嵌套包含。
预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。例如:
#defineAAA
#include"t.c"
#undefAAA
#include"t.c"
第十章 预处理命令
所谓编译预处理是指,在对源程序进行编译之前,先对源程序中的编译预处理命令进行处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。
一、宏定义与符号常量
在C语言中,“宏”分为无参数的宏(简称无参宏)和有参数的宏(简称有参宏)两种。
无参宏定义
1.无参宏定义的一般格式
#define 标识符 字符串
其中:“define”为宏定义命令;“标识符”为所定义的宏名,通常用大写字母表示,以便于与变量区别;“字符串”可以是常数、表达式、格式串等。
2.使用宏定义的优点
(1)可提高源程序的可维护性
(2)可提高源程序的可移植性
(3)减少源程序中重复书写字符串的工作量
例9.1 输入圆的半径,求圆的周长、面积和球的体积。要求使用无参宏定义圆周率。
/*程序功能:输入圆的半径,求圆的周长、面积和球的体积。 */
#define PI 3.1415926 /*PI是宏名,3.1415926用来替换宏名的常数*/
void main()
{
float radius,length,area,volume;
printf("Input a radius: ");
scanf("%f",&radius);
length=2*PI*radius; /*引用无参宏求周长*/
area=PI*radius*radius; /*引用无参宏求面积*/
volume=PI*radius*radius*radius*3/4; /*引用无参宏求体积*/
printf("length=%.2f,area=%.2f,volume=%.2f\n", length, area, volume);
}
3.说明
(1)宏名一般用大写字母表示,以示与变量区别。但这并非是规定。
(2)宏定义不是C语句,所以不能在行尾加分号。否则,宏展开时,会将分号作为字符串的1个字符,用于替换宏名。