C语言培训教材课件第6章.pptVIP

  • 0
  • 0
  • 约2.54千字
  • 约 20页
  • 2021-12-03 发布于广东
  • 举报
可编辑 烟台大学 计算机学院 刘 培 华 * 第6章 编译预处理 2005年3月 * 主要内容 编译预处理 多文件程序的调试方法 条件编译 2005年3月 * 源文件 *.c 运行文件 *.exe 编译 编译 编译 目标文件 *.obj 连接 编译 连接 连接 编译预处理 编 译 编译预处理包括: 宏定义 文件包含 条件编译 6.1 编译预处理 2005年3月 * 6.1 编译预处理〔续〕 源文件 *.c 运行文件 *.exe 目标文件 *.obj 编译 连接 main() { float r,s,c; scanf(“%f〞,r); s = r * r * 3.14; c = 2 * r * 3.14; printf(“s=%f, c=%f〞,s,c); } 如何修 改圆周率 2005年3月 * #define 宏名 字符串 宏定义的功能: 在进行编译前,用字符串原样替换程序中的宏名。 这个替换过程称为“宏替换〞或“宏展开〞,字符串也称为替换文本。 命令的一般格式: 6.1.1 不带参数的宏定义 6.1 编译预处理〔续〕 2005年3月 * 6.1 编译预处理〔续〕 例如: main() { float r,s,c; scanf(“%f〞,r); s = r * r * PI; c = 2 * r * PI; printf(“s=%f, c=%f〞,s,c); } 替 换 编 译 2005年3月 * 6.1 编译预处理〔续〕 ②为了增加程序的可读性,建议宏名用大写字母,其他的标识符用小写字母。 ③双引号中有与宏名相同的字符串不进行替换。 ④已经定义的宏名可以被后定义的宏名引用。在预处理时将层层进行替换。 说明: ① 宏定义的作用域是从定义处开始到源文件结束, 但根据需要可用undef命令终止其作用域。形式为: #undef 宏名 2005年3月 * 【例6.1】不带参数的宏定义。 源程序: #define S PI*r*r #define V 4*S*r/3 main( ) {float r; printf(\nInput r:); scanf(%f,r); printf(S=%.2f V=%.2f\n,S,V); } 编译预处理后的程序: main( ) { float r; printf(\nInput r:); scanf(%f,r); printf(S=%.2f V=%.2f\n, 3.14*r*r, 4* 3.14*r*r *r/3); } S V S V 进入编译 2005年3月 * 命令的一般形式 6.1.2 带参数的宏定义 #define 宏名(形参表) 字符串 功能: 在编译预处理时,把源程序中所有带参数的宏名用宏定义中的字符串替换,并且用宏名后圆括号中的实参替换字符串中的形参。 例如:#define MAX(X,Y) ((X)(Y)?(X):(Y)) 6.1 编译预处理〔续〕 2005年3月 * 6.1 编译预处理〔续〕 【例6.30】带参数的宏定义。 #define MAX(x,y) ((x)(y)?(x):(y)) main( ) { … printf(%d\n,a,b, MAX(a,b)); printf(%d\n,MAX(a+m,b+n)); } 分两次替换: ①将宏名MAX(a,b) 替换成字符串 ((x)(y)?(x):(y))。 ②用实参a替换形参x,实参b替换形参y。 程序中的两个printf语句被展开为: printf(%d\n, ((a)(b)?(a):(b))); printf(%d\n, ((a+m)(b+n)?( a+m):( b+n))); 2005年3月 * 6.1 编译预处理〔续〕 【例6.3】分析下面程序运行后的输出结果。 #define MA(x) x*(x-1) main( ) { int a=1,b=2; printf(%d\n, MA(1+a+b)); } 分两次替换: ①MA(1+a+b) 用x*(x-1) 替换。 ②用1+a+b替换x。 printf语句被展开为: printf(%d\n, 1+a+b*(1+a+b-1)); 特别注意: 由于替换文本中的x没有用括号括起,因此,1+a+b也不能用括号括起。 程序输出结果:8 2005年3月 * 6.1 编译预处理〔续〕 1.命令的一般形式 格式1: #include 文件名 格式2: #include 文件名 6.1.3 文件包含   文

文档评论(0)

1亿VIP精品文档

相关文档