1 / 27

预处理命令

预处理命令. 梁春燕 华电信息管理教研室. 主要内容. 预处理命令 宏定义 文件包含 条件编译 上机作业总结 上机作业 7. 预处理命令. 预处理. 定义 所谓预处理是指在进行编译之前所作的工作; 由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。. 预处理. 种类 宏定义 #define 文件包含 #include 条件编译 #if--#else--#endif 等 格式: “ # ” 开头 占单独书写行

lexine
Download Presentation

预处理命令

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 预处理命令 梁春燕 华电信息管理教研室

  2. 主要内容 • 预处理命令 • 宏定义 • 文件包含 • 条件编译 • 上机作业总结 • 上机作业7

  3. 预处理命令

  4. 预处理 • 定义 • 所谓预处理是指在进行编译之前所作的工作; • 由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。

  5. 预处理 • 种类 • 宏定义 #define • 文件包含 #include • 条件编译 #if--#else--#endif等 • 格式: • “#”开头 • 占单独书写行 • 语句尾不加分号

  6. 宏定义 宏体可缺省,表示宏名 定义过或取消宏体 • 不带参数宏定义 • 一般形式: #define 宏名 [宏体] • 功能:用指定标识符(宏名)代替字符序列(宏体) • 定义位置:任意(一般在函数外面) • 作用域:从定义命令到文件结束 • #undef可终止宏名作用域 • 格式: #undef 宏名 • 宏展开:预编译时,用宏体替换宏名---不作语法检查 • 引号中的内容与宏名相同也不置换 • 宏定义可嵌套,不能递归 例 #define MAX MAX+10 () • 宏定义中使用必要的括号()

  7. 例:无参宏定义 #define PI 3.1415826 #define R 3.0 #define S PI*R*R main(){ printf(“S=%f\n",S); }

  8. 带参数宏定义 • 一般形式: #define 宏名(参数表) 宏体 不能加空格 • 例 #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));

  9. 例 用宏定义和函数实现同样的功能 #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); } main() { int a,b,c,d,t; ……. t=max(a+b,c+d); ……… }

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

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

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

  13. 例 文件包含举例 /* 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)); }

  14. 文件包含 • 头文件 • C&C++编译系统为了方便程序员编程,预先编制了若干函数,按其类别将这些函数的声明及连接方式写入以“.h”为扩展名的文件中。这些文件称之为“头文件”。 • 使用方式: #include <头文件名> #include “头文件名”

  15. 条件编译 • 功能:对源程序中的内容进行条件控制,实现部分编译。 • 形式2: • #ifndef标识符 • 程序段 1 • #else • 程序段 2 • #endif • 形式3: • #if标识符 • 程序段 1 • #else • 程序段 2 • #endif • 形式1: • #ifdef 标识符 • 程序段 1 • #else • 程序段 2 • #endif

  16. 条件编译应用 • 避免多次包含同一文件 #ifndef STRING_H #define STRING_H #include <string.h> #endif ……

  17. 条件编译应用 • 调试程序 #define DEBUG …… #ifdef DEBUG #printf(“x=%d,y=%d, z=%d\n”,x,y,z); #endif ……

  18. 条件编译应用 • 根据不同环境和应用,编译程序的不同部分,减少目标程序长度,减少运行时间; • 提高程序可移植性、灵活性。 #define MAX 1 …… #if MAX max(a,b,c); #else min(a,b,c); #endif ……

  19. 小结

  20. 小结 • 预处理命令 • 宏定义#define 、无参和有参的宏定义; • 文件包含 #include; • 条件编译 #ifdef..#else…#endif

  21. 上机作业总结

  22. 上机作业4 • 试验内容 • 用选择法对15个整数排序(整数用scanf输入)。然后,输入一个数,用折半查找法找出该数是数组的第几个元素的值。如果该数不在数组中,则输出“无此数”。

  23. 上机作业5 • 试验内容 • 编写一个名为BitNum的函数,此函数有一个参数,此参数用于接收用户输入的一个整数,函数将统计此数字的位数,并将结果做为返回值返回给调用者。再编写main函数测试此函数。 例:用户输入3000,此函数用参数接收3000,将结果4做为返回值返回。

  24. 上机作业6 • 试验内容 • 编写三个函数,根据输入的一个十进制的数,分别输出对应的二进制数、八进制数和十六进制数。 • main函数中,根据用户输入的十进制数,调用函数,输出对应的二进制数、八进制数和十六进制数。

  25. 上机作业7 • 试验目的 • 掌握宏定义的方法; • 掌握文件包含处理的方法; • 掌握条件编译的方法。

  26. 上机作业7 • 试验内容 • 输入两个整数,求它们相除的余数。分别用函数和带参数的宏来实现。 • 在周一12:00之前,将作业(源程序和可执行程序)压缩后提交到此目录下: ftp://202.204.71.134/上机作业7/

  27. #include<stdio.h> #define YUSHU(x,y) x%y main() { void quyu(int m,int n); int a,b,c; printf("Please input two numbers:"); scanf("%d%d",&a,&b); if(b==0) printf("You input a wrong number\n"); else { c=YUSHU(a,b); printf("Yushu is %d\n",c); } quyu(a,b); } void quyu(int m,int n) {int d; if(n!=0) {d=m%n; printf("Yushu is %d\n",d);} else printf("You have inputed wrong numbers\n"); } END

More Related