C语言程序设计 第9章 预处理命令

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

区别“文件名”和<文件名> --关于#include的使用
#include “文件名” #include <文件名> 带双引号的文件名, 带尖括号的文件名, 系统将先在源程序所在 系统将直接按照指定 的目录内查找指定的包 的标准方式到相关的 含文件;如果找不到, 目录中去寻找。 再按照系统指定的标准 方式到相关的目录中去 寻找。 多用于包含用户文件。 多用于标准库函数。
答案:8 20 12

5、设有以下程序,为使之正确运行,请填 入应包含的命令行。其中,tryme()函数在 a:\myfile1.c 中有定义。
#include “a:\myfile1.c” ___________________ main() { printf(“\n”); tryme(); }
9.3 条件编译
格式一: #ifdef 标识符
#ifdef 标识符
程序段1
程序段1
#else
#endif
程序段2
#endif
格式二:
格式三:
#ifndef 标识符
程序段1 #else 程序段2 #endif
#if 表达式
程序段1 #else 程序段2 #endif
课堂练习:
1、以下叙述中不正确的是: (A)预处理命令行都必须以#号开始 (B)C程序中凡是以#开始的命令行都是预处理命 令行 (C)C程序在执行过程中对预处理命令进行预处理 (D)以下是正确的宏定义 #define IBM_PC

File Edit Run Compile Project Options Debug Break/watch ╒═══════════════════════════ │ Compiler │ │ │ Linker │ │ │ Environment │ │ │ Directories │ │ ┌──────────────────── │ │ Include directories: C:\TC\INCLUDE │ │ Library directories: C:\TC\LIB │ Output directory: D:\CDATA │ │ Turbo C directory: C:\TC │ │ Pick file name: │ │ Current pick file:
【例】
#define abs(x) (((x)>0)?(x):(-(x))) main( ) { int a=-3,b; float c=-2.4,d; b=abs(a); d=abs(c); printf("b=%d,d=%f\n",b,d); }
带参数的宏定义
#define
#define
宏名(参数表)
后三节为 自学内容
预处理命令



所谓预处理,就是C编译程序对C源程序 编译前由编译预处理程序对预处理命令 进行处理的过程。 C语言中,以“#”开头(如#define) 的行统称为编译预处理命令。 这些命令必须在一行的开头以“#”开 始,末尾不加分号,以区别一般的C语 句。
C语言的预处理命令
宏定义:
上机的时候要修改设置的原因:
无论哪一项设置错误都将影响系统查找文件!
使用文件包含需注意:



一条文件包含命令只能包含一个文件。 如果需要包含多个文件,就必须使用多 条文件包含命令。 文件包含的定义是可以嵌套的,即允许 一个被包含的文件包含其它文件。 被包含文件与其所在的文件在预编译后 成为同一个文件。
在一些版本的C语言中,还允许“文件名”中带路径。

file1.c
#include “file2.c” 包

file2.c
file1.c
B
B
A
A
(a)
(b)
文件包含示意图
说明:



被包含的文件常以“.h”(head)结尾, 用在文件头部,被称为“标题文件” 或“头部文件”,如 stdio.h。 其扩展名也可以为其它,如“.c”。 如果需要修改一些常数,不必修改每 个程序,只需修改一个文件(头部文 件)即可。
4、以下程序的运行结果是_____ main() { int b=5; #define b 2 #define f(x) b*(x) int y=3; printf("%4d",f(y+1)); #undef b printf("%4d",f(y+1)); #define b 3 printf("%4d\n",f(y+1)); }
{ float a, area, b;
a=3.6; b=4.0; PI*a*a area=S(a); cout<<“r=“<<a<<“\narea=”<<area<<endl; } 编译前机械替换, 实参形参一一对应
#define PI 3.1415926
S(r)
PI*r*r
PI*a+b*a+b #define S(r) PI*r*r S(a+b) S(a+b) PI*(a+b)*(a+b) void main(void) 错误 编译前机械替换, { float a, area, b; 实参形参一一对应 a=1; b=2; 宏展开时实参不运 area=S(a+b); 算,不作语法检查
S(a, b) 形式参数
字符串
a*b
.... 宏定义
定义的宏
float x, y,area; cin>>x>>y;
实参代入后还原
area=S(x, y); /* area=x*y; */ 宏调用 实际参数
按#define命令行中指定的字符串从左至右进行置换 宏名,字符串中的形参以相应的实参代替,字符串 中的非形参字符保持不变。
9.1.2 带参数的宏定义


一般形式: #define 宏名(参数表) 字符串 说明: “字符串”中包含“参数表”中所指定的 参数。
【例9.6】带参数的宏定义。
#define DB(x) ((x)*2) main( ) { double y; float z=10; y=DB(z); /* 等价于: y= ((z)*2); */ printf("y=%f\n",y); }
宏替换使用说明




(1)宏名一般用大写字母,以示与一般 变量区别。 (2)使用宏替换的作用是提高程序的清 晰性、可移植性。 (3)在同一个程序段中,同一个宏名不 能重复定义。 (4)“替换文本”不能替换双引号中的 字符串。





(5)“替换文本”并不替换用户标识符中 的成分。 (6) 宏定义是用宏名代替一个字符串,是 简单的置换,并不作语法检查。 (7) 宏定义语句末尾不能加分号,否则会 连分号一起置换。 (8) 可以用#undef命令终止宏定义的作 用域。 (9) “替换文本”中可以包含已定义过的 宏名。
#define , #undef 文件包含: #include
9.1 宏替换



不带参数的宏定义(即符号常量定义语句) #define 宏名 替换文本 编译时编译预处理程序自动对源程序中的 “宏名”用“替换文本”来替换,即宏展开 例如: #define LENGTH 300 #define PI 3.1415926

2、在宏定义#define PI 3.1415926 中, 用宏名PI代替一个: (A)常量 (B)单精度数 (C)双精度数 (D)字符串

3、以下程序的运行结果是_____ #include "stdio.h" #define FUDGE(y) 2.84+y #define PR(a) printf("%d",(int)(a)) #define PRINT1(a) PR(a);putchar('\n') main() 答案: { (int)(2.84+5*2)=12 int x=2; PRINT1(FUDGE(5)*x); }
#define S(a, b) a*b
机械地将实参代入 宏定义的形参形式
area=S(3,2)
3*2
S(a,b)等同于 a*b
S(3,2)等同于 3*2
#define PI 3.1415926 #define S(r) PI*r*r void main(void)
S(r)
S(a)
PI*r*r
PI*a*a
作业

9.1 9.2 9.3
写出下面程序的运行结果:
#define MIN(x,y) (x)<(y)?(x):(y) main() { int i=10,j=15,k; k=10*MIN(i,j); printf(“%d\n”,k); }
9.2 文件包含


文件包含就是在一个文件中,包含另外 一个文件的全部内容。 文件包含功能由#include命令来实现。 #include命令的一般形式: #include “文件名” #include <文件名>
【例9.8】#include的使用。
#include <math.h> #include <stdio.h> main( ) { float a,b; float c; scanf("%f%f",&a,&b); c=fabs(a+b); printf("The absolute value of a plus b is %.2f\n",c); }
cout<<“r=“<<a<<“\narea=”<<area<<endl; } #define S(r) PI*(r)*(r)
区别函数和带参数的宏定义:



函数调用时,先求出实参表达式的值,再用这 个值赋给形式参数;带参数的宏定义仅仅进行 字符串的简单替换。 函数调用是在程序运行时分配临时内存单元; 而宏展开是在编译时进行,展开时不分配内存 单元,不进行值传递。 函数调用只占运ቤተ መጻሕፍቲ ባይዱ时间;宏替换只占编译时间。 宏替换后使源程序增长,函数调用不会。
第9章 编译预处理
编译预处理 高级语言编译过程
库文件 (各种函数) 可执行文件 (二进制文件) 连接 *.EXE
编译预处理
源程序
目标文件 编译
(文本文件)
*.CPP
(二进制文件)
*.OBJ
C语言提供的编译预处理的功能有以下三种:
宏定义 文件包含 条件编译
主要内容


宏替换 文件包含 条件编译 预定义宏 运算符#和##
相关文档
最新文档