C语言_第13章.ppt

上传人:少林足球 文档编号:4119801 上传时间:2019-10-19 格式:PPT 页数:21 大小:2.06MB
返回 下载 相关 举报
C语言_第13章.ppt_第1页
第1页 / 共21页
C语言_第13章.ppt_第2页
第2页 / 共21页
C语言_第13章.ppt_第3页
第3页 / 共21页
C语言_第13章.ppt_第4页
第4页 / 共21页
C语言_第13章.ppt_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《C语言_第13章.ppt》由会员分享,可在线阅读,更多相关《C语言_第13章.ppt(21页珍藏版)》请在三一文库上搜索。

1、第十三章 编译与预处理,第十三章 编译与预处理,13.1 宏定义 13.2 #include指令 13.3 条件编译 13.4 实战练习,本章学习内容,13.1 宏定义,在C语言的源程序中允许用一个标识符来表示一个字符串,称为“宏” 被定义为“宏”的标识符称为“宏名” 在预处理阶段,对程序中所有出现的“宏名”都用宏定义中的字符串替换,称为“宏替换”或“宏展开” 宏定义是预处理命令的一种,分为不带参数的宏定义和带参数的宏定义,13.1.1 不带参数的宏定义,定义的一般形式: #define 宏名 字符串 其中#表示这是一条预处理命令;#define表示宏定义命令 宏名必须是一个标识符 字符串可以

2、是常数、表达式、格式字符串等,13.1.1 不带参数的宏定义,例如: #define PI 3.1415 使用宏定义的好处是在需要改变一个常量值时,只需要改变#define这一行,整个程序中使用该宏名的地方都会被同步修改,提高程序的灵活性,说明 1. 宏名要简单且意义明确,一般习惯使用大写字母表示 2. 宏定义用宏名表示一个字符串,在宏展开时用该字符串替换宏名 3. 宏定义不属于语句,不能在行末使用分号,13.1.1 不带参数的宏定义,说明 4. 宏定义可以嵌套定义 5. 宏定义必须在函数外,使用#undef终止作用域 6. 程序中若宏名出现在引号中,预处理程序不会进行替换 #define T

3、EST 100 printf(“This is TEST”);,13.1.2 带参数的宏定义,定义的一般形式: #define 宏名(形参表) 字符串 宏调用的一般形式: 宏名(实参表);,例如: #define FUN(y) (y) * (y) + 3 * (y) k = FUN(5); 替换后如下: k = 5 * 5 + 3 * 5;,13.1.2 带参数的宏定义,说明 1. 宏名与形参表之间不能有空格出现 #define MAX(a, b) (a b) ? a : b 若写成: #define MAX (a, b) (a b) ? a : b 将被认为是无参数的宏定义,宏名MAX代表字

4、符串(a, b) (a b) ? a : b;所以宏展开时如下。 宏调用语句:max = MAX(x, y); 将会变成: max = (a, b) (a b) ? a : b(x, y);,13.1 宏定义,2. 在宏定义中形参是标识符,而宏调用中实参可以是表达式,这时字符串中的形参要加上括号,若形参不加括号,那么宏定义中的结果有可能是错误的 #define FUN(a, b) 2 * a + b 宏调用如下: k = FUN(1+2, 3+4); 那么宏替换的结果如下: k = 2 * 1 + 2 + 3 + 4; /*结果为11*/ 本例宏定义的本意是: k = 2 * (1+2) +

5、(3+4); /*结果为13*/,13.1.2 带参数的宏定义,3. 在带参数的宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值,要用它们去替换形参,因此必须作类型说明。与函数中的情况不同,在函数中,形参和实参是两个不同的量,各自有着自己的作用域,调用时要把实参值赋给形参,进行“值传递”。而在带参数的宏定义中,只是符号替换,不存在值传递的问题,13.2 #include 指令,#include指令是文件包含命令 在一个源文件中使用#define指令可以将另一个源文件中的内容全部包含进来 #include指令的一般形式: #include “文件名” 或 #inc

6、lude ,13.2 #include 指令,#include指令是文件包含命令 说明 1. 使用尖括号表示系统首先到存放C库函数头文件所在的目录中去查找所包含的文件;使用双引号时,系统先在用户当前目录中查找所包含的文件,若未找到,再去存放C库函数头文件所在目录查找。通常如果包含系统文件,使用尖括号;包含自定义文件,使用双引号 2. 一条#include指令只可以包含一个文件,需要包含多个文件时,需要使用多条#include指令 3. 文件包含允许嵌套,13.3.1 #if命令,条件编译是在满足一条条件时,才对一部分代码参与编译 #if 常量表达式 语句段1 #else 语句段2 #endif

7、 含义:如果#if命令后的常量表达式为真,使用语句段1参与编译;否则使用语句段2参与编译,13.3.2 #ifdef及#ifndef命令,#ifdef命令表示“如果有定义” #ifdef 宏名 语句段1; #else 语句段2; #endif 含义:如果宏名被定义过,使用语句段1参与编译;否则使用语句段2参与编译,13.3.2 #ifdef及#ifndef命令,#ifndef命令表示“如果未定义” #ifndef 宏名 语句段1; #else 语句段2; #endif 含义:如果宏名未被定义过,使用语句段1参与编译;否则使用语句段2参与编译,13.3.3 #undef命令,#undef命令可以

8、使一个宏定义失效,用来控制宏名的作用域 一般形式: #undef 宏名 例如: #define SIZE 100 #undef SIZE,13.3.4 #line命令,C语言提供定义好的宏 _LINE_存放当前编译行的行号 _FILE_存放当前编译的文件名 #line命令就是用来修改_LINE_和_FILE_的内容,一般形式: #line 行号 “文件名” 其中行号为任一正整数,可选的文件名为任意有效文件标识符,行号为源程序中当前行号,文件名为源文件的名字,13.3.5 #pragma命令,1. pragma命令 #pragma命令的作用是设置编译器的状态,或者指示编译器完成一些特定的动作 #

9、pragma 参数 其中,参数可以有以下几种: (1)message参数能够在编译信息输出窗口中输出相应的信息 (2)code_seg参数设置程序中函数代码存放的代码段 (3)once参数保证头文件只被编译一次,13.3.5 #pragma命令,2.预定义宏名 ANSI标准说明了以下5个预定义宏替换名。 _LINE_:其含义是当前被编译代码的行号。 _FILE_:其含义是当前源程序的文件名称。 _DATE_:其含义是当前源程序的创建日期。 _TIME_:其含义是当前源程序的创建时间。 _STDC_:其含义是用来判断当前编译器是否为标准C,若其值是1则表示符合标准C,否则不是标准C。,13.4 实践练习,1从键盘输入两个正整数,用宏定义实现他们的和、差、积、商。 2从键盘输入三个整数,分别使用函数和宏,找出它们的最小数。,END,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1