收藏 分享(赏)

C-4(预编译).ppt

上传人:11xg27ws 文档编号:8114555 上传时间:2019-06-09 格式:PPT 页数:39 大小:979.50KB
下载 相关 举报
C-4(预编译).ppt_第1页
第1页 / 共39页
C-4(预编译).ppt_第2页
第2页 / 共39页
C-4(预编译).ppt_第3页
第3页 / 共39页
C-4(预编译).ppt_第4页
第4页 / 共39页
C-4(预编译).ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

1、3G-嵌入式开发,C语言强化,蜚声腾茂教育科技,第四讲 编译预处理,预处理命令 宏定义 文件包含 条件编译,预处理,预处理是c语言的一部分吗? 包含“#”号的都是预处理吗? 预处理指令后面都不需要加“ ;”吗?,作用:对源程序编译之前做一些处理,生成扩展C源程序(主要处理#开始的预编译指令) 种类 宏定义 #define 定义标识、常数、函数 文件包含 #include 条件编译 #if #else #endif 格式: “#”开头 占单独书写行 末尾不加分号,预处理,c语言预处理指令1,c语言预处理指令2,C 预处理指令-拓展,宏定义 不带参数宏定义 一般形式: #define 宏名 宏体

2、功能:用指定标识符(宏名)代替字符序列(宏体),如 #define YES 1#define NO 0#define PI 3.1415926#define OUT printf(“Hello,World”);,宏名一般用大写字母,以便与程序中的变量名或函数名区分,定义位置:任意(一般在函数外面) 作用域:从定义命令到文件结束 #undef可终止宏名作用域格式: #undef 宏名,宏展开:预编译时,用宏体替换宏名-不作语法检查,宏定义可嵌套,不能递归,引号中的内容与宏名相同也不置换,宏定义中使用必要的括号(),例 #define WIDTH 80#define LENGTH (WIDTH+4

3、0)var=LENGTH*2; 宏展开:var= (80+40 )*2;,例 #define PI 3.14159printf(“2*PI=%fn”,PI*2); 宏展开:printf(“2*PI=%fn”,3.14159*2);,例 #define MAX MAX+10 (),如 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”);,宏定义只做字符替换,不分配内存空间,当宏定义在一行中写不

4、下,只需在最后一个字符后紧接着加一个“”,例 #define LEAP_YEAR year%4=0&year%100!=0|year%400=0,举例说明,数值宏常量:#define PI 3.141592654 好处:以防修改时麻烦 define 宏定义的数据是没有类型的 字符串宏常量: #define PART_1 E:计量2010-11-20课件 #define PART_1 “E:计量2010-11-20课件” 如果路径太长,一行写下来别扭,怎么办?,知识拓展,用define宏定义注释符号 上机调试,看看结果 why?,因为注释先于预处理指令被处理,带参数宏定义 一般形式: #defi

5、ne 宏名(形参表) 宏体,例 #define S (r) PI*r*r 相当于定义了不带参宏S,代表字符串“(r) PI*r*r”,宏展开:形参用实参换,其它字符保留 宏体及各形参外一般应加括号(),例 #define S(a,b) a*barea=S(3,2); 宏展开: area=3*2;,不能加空格,例 #define POWER(x) x*xx=4; y=6;z=POWER(x+y); 宏展开:z=x+y*x+y; 一般写成: #define POWER(x) (x)*(x) 宏展开: z=(x+y)*(x+y);,在带有参数的宏定义中,形参不分配内存单元, 因此不必做类型定义,带参

6、数的宏定义和函数虽然很相似,但有质的区别,#define SWAP(a,b) t=b;b=a;a=t;. main() int a,b,t;scanf(“%d%d”, ,用宏定义和函数实现数值交换,带参数的宏定义和函数虽然很相似,但有质的区别,注意,用宏定义表达式时,要使用完备的括号。正确的定义应为:#define RECTANGLE_AREA( a, b ) (a) * (b) 使用宏时,不允许参数发生变化。示例:#define SQUARE( a ) (a) * (a)int a = 5; int b;b = SQUARE( a+ ); / 结果:a = 7,即执行了两次增1。正确的用法是

7、:b = SQUARE( a );a+; / 结果:a = 6,即只执行了一次增1。,提醒,宏定义(表达式)千万别吝啬括号!,条件编译,定义:对源程序中某段程序通过条件来控制是否参加编译。(对程序的移植和调试) 形式:,较少运行时间 方便逐段调试,#ifdef 标识符 程序段1 #else 程序段2 #endif,#ifndef 标识符 程序段1 #else 程序段2 #endif,#if 常量表达式 程序段1 #else 程序段2 #endif,文件包含 功能:它可用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。 形式: #include “文件名” 或 : #includ

8、e ,处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译, 直接按标准目录搜索 “ ” 先在当前目录搜索,再搜索标准目录,模块化程序设计,被包含文件内容 源文件(*.c) 头文件(*.h),宏定义 数据结构定义 函数说明等,文件包含可嵌套,头文件,作用:预防多重包含同一源文件。 组成:(1)头文件开头处的版权和版本声明;(2)预处理块;(3)函数和类结构声明等。在头文件中,用 ifndef/define/ endif结构产生预处理块,用 #include 格式来引用库的头文件。,纽带,#ifndef GRAPHICS_H (作用:防止graphics.

9、h被重复引用) #define GRAPHICS_H #include (作用:引用标准库的头文件.#include. (作用:引用非标准库的头文件).void Function1(.); (作用:全局函数声明).#endif,知识拓展和深化,#line #pragma message #pragma once #pragma hdrstop #pragma resource #pragma warning #pragma comment #pragma pack,#line,用法 #line number“filename”-行数,文件名 在混合语言编程环境中,一般都有一个预编译器,把寄宿语

10、言翻译成C这种寄主语言,而翻译过程会导致我们的代码行数发生变化,这时候编译器给我们报告那一行出现问题了之类的情况,就会导致我们不知所云,因为那个行数不是我们在实际代码中看到的行数。在可能出错的地方插入#line语句,将编译器内部存储的函数和文件名用你传给的行数和名称代替,这样该处出错时,编译器将返回你给出的行数和文件名。,#include int main() int c;printf(“please input a integern“);scanf(“%d“, ,例子,上机调试,#pragma,作用:设定编译器的状态或者是指示编译器完成一些特定的动作。 格式:#pragma para-参数

11、说明:指令是比较复杂的 介绍几种典型的参数,#pragma message,message 参数:在编译信息输出窗口中输出相应的信息 #pragma message(“消息文本”) 当编译器遇到这条指令的时候,就在编译的输出窗口中,将消息文本打印出来 我们可以通过这个代码在编译的时候对我们的源代码进行检查(举个例子详细说明),例子,#define UNICODE #ifdef UNICODE #pragma message(“使用UNICODE字符集“) #else #pragma message(“使用ANSI字符集“) #endif int main() return 0; ,输出窗口,#

12、字符串化运算符,如何用#?(宏函数的替换部分) 例子: #define SQR(x) printf(“the square of x is %d”,(x)*(x); 使用宏:SQR(5); 输出的结果是: the square of x is 25. 我们想输出: the square of 5 is 25 ? 修改如下: #define SQR(x) printf(“the square of “#x” is %d”,(x)*(x);,#运算符,#define print(x) printf(#x)Print(welcome to china) 思考:如何输出一个“welcome to ch

13、ina”?,#define print(x) printf(“the no,”#x”, is”),并接运算符#,作用:把参数连接在一起,#define NUM(a,b,c) a#b#c #define STR(a,b,c) a#b#c main() printf(“%dn“,NUM(1,2,3); printf(“%sn“,STR(“aa“,“bb“,“cc“); ,123 aabbcc,小练习,1、什么是预编译,何时需要预编译? 答案: 、总是使用不经常改动的大型代码体。 、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编

14、译头。,2、对于一个频繁使用的短小函数,在C语言中应用什么实现? 答案:c用宏定义,3、请说出const 与#define 相比优点 答案:(1)const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。(2)有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。,关键术语主调函数 calling function 被调函数 called function 数据流 data flow 函数体 function body函数声明 function declarati

15、on 只读模式 read mode参数传递 parameter passing 空格标记 space flag作用域 scope 缓冲区 buffer参数列表 parameter list 关键字 key 转换函数 converting function 精度 precision选择 selection 二进制 binary递归 recursion 查询 inquiry,作业,Thank you!,课后习题,实现让用户输入一个学生分数,然后输出该分数的级别 求1!+2!+3!+4!+5!+n! 输出某个正整数的各位数字之和 求两个数的最大公约数和最小公倍数,课后练习,用冒泡排序法对一维数组中的整数进行排序,使其元素的值按从小到大顺序排序 用选择排序法 从键盘上输入一行字符,将其中的大写字母改为小写字母,其他字符不变,然后逆向输出。,完成下列程序,输出下图所示。(“*”的ASCII码是42, “.”的ASCII码是46)*.*.*.*.*.*.*.*,#include #define N 8 int main() int i,j,k; return 0; ,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报