第八章 编译预处理 西安工程大学.

Slides:



Advertisements
Similar presentations
C++语言程序设计教程 第5章 构造数据类型 第6章 C++程序的结构.
Advertisements

无锡商业职业技术学院 机电工程学院党总支孙蓓雄
电子成绩单项目实现.
全面了解入党程序 认真履行入党手续 第一讲 主讲人:陈亭而.
中共湖北大学知行学院委员会党校 入党材料规范填写指导 学工处 李华琼 二〇一三年十二月.
云南财经大学2010年党员发展培训—— 党员发展工作培训 校党委组织部 2010年9月17日.
『外食謹慎選、健康輕鬆來 上班族健康挑食小撇步』
“八皇后”问题 崔萌萌 吕金华.
第一章 C语言概述 计算机公共教学部.
第三讲 事务性文书的写作 (计划 总结 调查报告 ).
一元一次方程的应用 行程问题.
网络条件下老干部工作信息的应用与写作 齐齐哈尔市委老干部局 山佐利.
咨询师的个人成长 第一课:如何撰写个人成长报告以及答辩.
第八章 诉讼法 第一节 诉讼法概述 第二节 民事诉讼法 第三节 行政诉讼法 第四节 刑事诉讼法.
普及纳米知识 推动科技进步.
通 知 通知是批转下级机关的公文,转发上级机关和不相隶属机关的公文,传达要求下级机关办理和需要有关单位周知或执行的事项,任免人员时使用的公文。
4.3函数 4.3.1函数的概念及定义 1、函数的概念: 可以被其它程序调用具有 特定功能的一段相对独立的 程序(模块),称函数。
高级语言程序设计 主讲人:陈玉华.
第5章 函数与预处理 《 C语言程序设计》 (Visual C++ 6.0环境) 本章导读
第4章 函数与预处理 4.1 概述 4.2 定义函数的一般形式 4.3 函数参数和函数的值 4.4 函数的调用 *4.5 内置函数
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
第13章 编译预处理 宏定义 文件包含 条件编译.
C程序设计.
If … else 選擇結構 P27.
第10章 预处理过程 一、编译预处理指令概述 二、预处理指令 #include 三、#define指令.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
第7章 编译预处理 本章要求: 本章重点: 本章难点: 掌握用#define定义无参数宏和带有参数宏定义和调用方法;
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
文件读写实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
第五章 C/C++及汇编语言的混合编程 5.1 ARM C/C++编译器 5.2 在C/C++程序中内嵌汇编指令
第12章 编译预处理 12.1 了解编译预处理 12.2 宏 定 义 12.3 文 件 包 含 12.4 条 件 编 译.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
第6章 预 处 理.
第九章 预处理命令.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第8章 编绎和预处理.
C语言程序设计 主讲教师:陆幼利.
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
$9 泛型基础.
C程序设计 谭浩强 著 清华大学出版社.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C语言程序示例: 1.输入10个数,按从小到大的顺序排序。 2.汉诺塔问题。.
C程序设计.
Oop8 function函式.
C语言程序设计 第九章 预处理命令.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
C程序设计.
第一章 C语言概述 教师:周芸.
第4章 Excel电子表格制作软件 4.4 函数(一).
C语言程序设计 李祥 QQ:
目录 8.1 宏定义 8.2 文件包含 8.3 条件编译 1.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第6章 预 处 理.
第二章 类型、对象、运算符和表达式.
第8章 编译预处理 所谓编译预处理是指,在对源程序进行编译之前,先对源程序中的编译预处理命令进行处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。 8.1 宏定义与符号常量 8.2 文件包含 8.3 条件编译 [Return]
C程序设计.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
第9章 预处理命令.
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
_03宽字符与Unicode编程 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
第18讲 从C到C++ 计算机与通信工程学院.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
8的乘法口诀 导入 新授 练习.
Presentation transcript:

第八章 编译预处理 西安工程大学

基本内容: 8.1概述 8.2宏定义 8.3文件包含 8.4条件编译

8.1概述 作用:对源程序编译之前做一些处理,生成扩展C源程序 格式 种类: “#”开头 占单独书写行 语句尾不加分号 宏定义 #define 文件包含 #include 条件编译 #if--#else--#endif等

8.2 宏定义 不带参数宏定义 一般形式: #define 宏名 [宏体] 功能:用指定标识符(宏名)代替字符序列(宏体) 宏体可缺省,表示宏名 定义过或取消宏体 8.2 宏定义 不带参数宏定义 一般形式: #define 宏名 [宏体] 功能:用指定标识符(宏名)代替字符序列(宏体) 定义位置:任意(一般在函数外面) 作用域:从定义命令到文件结束 #undef可终止宏名作用域 格式: #undef 宏名 如 #define YES 1 #define NO 0 #define PI 3.1415926 #define OUT printf(“Hello,World”); 例 #define YES 1 main() { …….. } #undef YES #define YES 0 max() {…….. YES原作用域 YES新作用域 例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2; 宏展开:var= 80+40 *2; 例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2; 宏展开:var= 80+40 *2; ( ) ( ) 宏展开:预编译时,用宏体替换宏名---不作语法检查 引号中的内容与宏名相同也不置换 如 if(x==YES) printf(“correct!\n”); else if (x==NO) printf(“error!\n”); 展开后: if(x==1) printf(“correct!\n”); else if (x==0) printf(“error!\n”); 例 #define PI 3.14159 printf(“2*PI=%f\n”,PI*2); 宏展开:printf(“2*PI=%f\n”,3.14159*2); 宏定义可嵌套,不能递归 宏定义中使用必要的括号() 例 #define MAX MAX+10 ()

带参数宏定义 一般形式: #define 宏名(参数表) 宏体 例 #define S(a,b) a*b ……….. 不能加空格 例 #define S(a,b) a*b ……….. area=S(3,2); 宏展开: area=3*2; 宏展开:形参用实参换,其它字符保留 宏体及各形参外一般应加括号() 例 #define S (r) PI*r*r 相当于定义了不带参宏S,代表字符串“(r) PI*r*r” 例 #define POWER(x) x*x x=4; y=6; z=POWER(x+y); 宏展开:z=x+y*x+y; 一般写成: #define POWER(x) ((x)*(x)) 宏展开: z=((x+y)*(x+y));

< > 例 用宏定义和函数实现同样的功能 #define MAX(x,y) (x)>(y)?(x):(y) ……. main() { int a,b,c,d,t; t=MAX(a+b,c+d); …… } 宏展开:t=(a+b)>(c+d)?(a+b):(c+d); int max(int x,int y) { return(x>y?x:y); { int a,b,c,d,t; t=max(a+b,c+d); ……… 例 用宏定义和函数实现同样的功能 < >

带参的宏与函数区别 带参宏 函数 处理过程 不分配内存 简单的字符置换 分配内存 先求实参值,再代入形参 处理时间 编译时 程序运行时 参数类型 无类型问题 定义实参,形参类型 程序长度 变长 不变 运行速度 不占运行时间 调用和返回占时间 < >

8.3 文件包含 功能:一个源文件可将另一个源文件的内容全部包含进来 一般形式: #include “文件名” 8.3 文件包含 功能:一个源文件可将另一个源文件的内容全部包含进来 一般形式: #include “文件名” 或 #include <文件名> <> 直接按标准目录搜索 “” 先在当前目录搜索,再搜索标准目录 可指定路径 处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译 #include “file2.c” file1.c file2.c A B

被包含文件内容 文件包含可嵌套 源文件(*.c) 头文件(*.h) 宏定义 数据结构定义 函数说明等 #include “file2.c” A file3.c C #include “file3.c” file2.c B file1.c A file3.c file2.c

/* powers.h */ #define sqr(x) ((x)*(x)) #define cube(x) ((x)*(x)*(x)) #define quad(x) ((x)*(x)*(x)*(x)) /*ch8_10.c*/ #include <stdio.h> #include "d:\fengyi\bkc\powers.h" #define MAX_POWER 10 void main() { int n; printf("number\t exp2\t exp3\t exp4\n"); printf("----\t----\t-----\t------\n"); for(n=1;n<=MAX_POWER;n++) printf("%2d\t %3d\t %4d\t %5d\n",n,sqr(n),cube(n),quad(n)); } 例 文件包含举例

8.4条件编译 [Return] 条件编译可有效地提高程序的可移植性,并广泛地应用在商业软件中,为一个程序提供各种不同的版本。 8.4.1 #ifdef ~ #endif和#ifndef ~ #endif命令 8.4.2 #if ~ #endif [Return]

8.4.1 #ifdef ~ #endif和#ifndef ~ #endif命令 一般格式 #ifdef 标识符 程序段1; [#else 程序段2;] #endif 功能:当“标识符”已经被#define命令定义过,则编译程序段1,否则编译程序段2。 在不同的系统中,一个int 型数据占用的内存字节数可能是不同的。

[Return] 利用条件编译,还可使同一源程序即适合于调试(进行程序跟踪、打印较多的状态或错误信息),又适合高效执行要求。 关于#ifndef ~ #endif命令 格式与#ifdef ~ #endif命令一样,功能正好与之相反。 [Return]

8.4.2 #if ~ #endif 一般格式 #if 常量表达式 程序段1; [#else 程序段2;] #endif 功能:当表达式为非0(“逻辑真”)时,编译程序段1,否则编译程序段2。

[例8.2] 输入一个口令,根据需要设置条件编译,使之能将口令原码输出,或仅输出若干星号“*”。 /*例8.2代码文件名:AL8_2.C*/ #define PASSWORD 0 /*预置为输出星号*/ main() { …… /*条件编译*/ #if PASSWORD /*源码输出*/ …… #else /*输出星号*/ #endif }

[例8.3] 条件编译的使用 #define LETER 1 main() { char str[20]="C Language",c; int i=0; while((c=str[i])!='\0') { i++; #if LETER if(c>='a'&&c<='z') c=c-32; #else if(c>='A'&&c<='Z') c=c+32; #endif printf("%c",c); }