康辉C语言视频教程6

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

6.1.1 简单宏替换
#define HELLO bonjour bonjour #define A B main() main() { printf(“HELLO\n”); printf(“HELLO\n”); printf(“% n”,’A’); printf(“%c\n”,’A’); }
§6.2
文件包含
文件包含: 文件包含 是指一个源文件可以将另外一个 源文件的全部内容包含进来。其一般形式为: 源文件的全部内容包含进来 。 其一般形式为 : #include “文件名”/#include <文件名 文件名” 文件名 > 功能: 把指定文件的内容插入到该#include 功能 把指定文件的内容插入到该 命令所在之处。其中: 命令所在之处。其中: 文件名” 首先在当前目录中寻找文件 首先在当前目录中寻找文件。 “文件名”:首先在当前目录中寻找文件。如果 找不到,再到一系列系统预先设定的目录中去 找不到 再到一系列系统预先设定的目录中去 找。 文件名>:则不在当前目录中寻找, >:则不在当前目录中寻找 <文件名>:则不在当前目录中寻找,而是径 直到系统预先设定的目录中去寻找该文件。 系统预先设定的目录中去寻找该文件 直到 系统预先设定的目录中去寻找 该文件 。
表 示 要 把 源 代 码 中 出 现 在 该 行 之 后 的 每 一 个 string1 都 用 string1 string2来代替。 string2来代替。
6.1.1 简单宏替换
说明: 说明: 1. 宏定义必须写在第一次使用该宏定义的代码之前; 宏定义必须写在第一次使用该宏定义的代码之前; 第一次使用该宏定义的代码之前 2. 宏定义不是以分号结束的; 宏定义不是以分号结束 不是以分号结束的 3. #define、string1、string2之间至少要有一个空格; #define、string1 string2之间至少要有一个空格 至少要有一个空格; 4. string1称为宏,string2称为宏扩展 string1称为宏 string2称为宏扩展 例如:PI是宏, 例如:PI是宏 是宏, 3.1415926536是宏PI的宏扩展 1415926536是宏 的宏扩展 是宏PI 5. 宏名用大写字母来表示是一个传统的习惯; 宏名用大写字母来表示是一个传统的习惯 传统的习惯; 6. 使用宏定义的好处: 使用宏定义的好处: 1)简化程序的书写 2)提高程序的可读性 3)便于程序的修改 4)提高程序的可移植性
6.1.1 简单宏替换
又如不同操作系统的文件结束符是不同的, 又如不同操作系统的文件结束符是不同的 , 有 的是有的是用其它字符。为此, 的是-1,有的是用其它字符。为此,我们用如下 的宏定义: #define EOF -1 的宏定义: 定义一个宏EOF 。 定义一个宏 EOF。 当系统环境改变时只需重新 定义一下EOF 即可方便地将程序移植到新环境 定义一下 EOF即可方便地将程序移植到新环境 上。 7. 预处理程序将不替换字符串中或用单引号括起 预处理程序将不替换字符串中或用单引号括起 来的字符常量的 来的字符常量的“宏”。
(2)文件 文件file1.c 文件 #include “print. main() { int PR(D1,a); PR(D2,a,b); PR(D3,a,b,c); }
文件file1.i 文件 运行结果: 运行结果: 1 main() 1 2 { int a=1,b=2,c=3; 1 2 3 printf ("%d" "\n" ,a); printf ("%d" "%d" "\n" ,a,b); printf ("%d" "%d" "%d" "\n" ,a,b,c); }
6.1.1 简单宏替换
例如: 例如: #define HELLO “bonjour\n” “bonjour\ #define A ‘B’ main() { printf(HELLO); printf(HELLO); printf(“% printf(“%c\n”, A); A); }
bonjour bonjour B
6.1.2 带有参数的宏替换
取消已有的宏定义命令: #undef 宏名 取消已有的宏定义命令: 作用: #undef行后面出现的 宏名”将不被扩展。 行后面出现的“ 作用:在#undef行后面出现的“宏名”将不被扩展。 例如: 例如: #define P 3.14 main() { float r=2.0; r=2 printf(p*r*r); printf(p*r*r); #undef p {int p=10; p=10; printf(“% n”,p); printf(“%d\n”,p);} }
3.000000
6.1.2 带有参数的宏替换
#define square(n) n*n main() { printf(″%f printf(″%f\n″,27.0/square(3.0)); 27. /square(3 )); }
type test.i test. main() { printf(″%f printf(″%f\n″,27.0/3.0*3.0); 27. }
6.1.2 带有参数的宏替换
2.在定义带有参数的宏替换时 , 要用 圆括号 将宏扩 在定义带有参数的宏替换时,要用圆括号 圆括号将宏扩 展部分括起来。 展部分括起来。如: #define square(n) (n*n) main() { printf(“% n”,27. /square(3 )); printf(“%f\n”,27.0/square(3.0)); }
例如: 例如: f1.c f1.c
#include f2.c
f2.c
B
B A A
(1)文件 )文件print. h #define PR printf h” #define NL “\n” #define D “%d” a=1,b=2,c=3; #define D1 D NL #define D2 D D NL #define D3 D D D NL
6.1.1 简单宏替换
#define PI 3.1415926536 ┇ double area(radius) double radius; radius; { return(PI*radius*radius);} return(PI*radius*radius); 其中: 其中: 1. 由“#”开始的命令是C预处理程序处理的命令。 #”开始的命令是 预处理程序处理的命令。 开始的命令是C 2. #define是宏定义命令,其一般形式为: #define是宏定义命令 其一般形式为: 是宏定义命令, string1 string2 #define string1 string2
27.000000
6.1.2 带有参数的宏替换
3. 带参数的宏调用和函数调用是完全不同的. 带参数的宏调用和函数调用是完全不同的. 宏调用是在编译之前 编译之前完成的 宏调用是在编译之前完成的 函数调用是在编译之后实现的。 编译之后实现的 函数调用是在编译之后实现的。例: 1 main() 4 {int i=1; i=1 9 while(i<=10) while(i<=10) 16 printf(“% n”,square(i++)); printf(“%d\n”,square(i++)); 25 } square(n) 36 int n; 49 { 64 return(n*n); return(n*n); 81 } 100
2 12 30 56 90
6.1.2 带有参数的宏替换
#define square(n) (n*n) main() { int i=1; i=1 printf(“% n”,square(i+4)); printf(“%d\n”,square(i+4)); } 最好把每个形参也用圆括号括起来 每个形参也用圆括号括起来。 最好把每个形参也用圆括号括起来。如: #define square(n) ((n)*(n)) 则经宏扩展后变为: ((i+4)*(i+4 则经宏扩展后变为: ((i+4)*(i+4))
6.1.2 带有参数的宏替换
预处理程序(cpp.exe)宏替换之后,将变为: 经C预处理程序(cpp.exe)宏替换之后,将变为: main() {printf(“%f\ {printf(“%f\n”,(3.1415926536*2.5*2.5)); } 其中: area(2.5)称为宏调用,其形式为: 称为宏调用 其中: area(2.5)称为宏调用,其形式为: 宏名(实参表) 宏名(实参表) 注意:1.宏定义中的 宏名” 宏定义中的“ 参数表) 注意:1.宏定义中的“宏名”和“(参数表)”之间 不能有空格。 不能有空格。 如:#define area(x) (3.1415926536*x*x) 不能写成 #define area (x) (3.1415926536*x*x)
Biblioteka Baidu
例如文件defs.h 例如文件 #define BUFSIZE 128 #define EOF ′-1′ #define FALSE 0 #define TRUE 1 #define NULL ′\0′ \ #define BELL 7 #define ESC 27 #define BLANK 32
第六章
C预处理程序
C 的源程序在进行编译之前要经过 “ 预处理 ” 。 的源程序在进行编译之前要经过“预处理” 预处理程序主要完成以下三种功能: C预处理程序主要完成以下三种功能: 1. 宏替换 2. 文件包含 3. 条件编译
6.1 宏替换
例如: 例如:
double area(radius) double radius; radius; { return(3 1415926536*radius*radius); return(3.1415926536*radius*radius); }
6.1.1 简单宏替换
例如: 例如: #define PI 3.14 ┇ double area(r) double r; { return(PI*r*r);} return(PI*r*r); 当要提高π的精度时, 当要提高π的精度时,可以将宏定义 #define PI 3.14 改为 #define PI 3.1415926536
6.1.2 带有参数的宏替换
将函数调用改成带有参数的宏调用。 将函数调用改成带有参数的宏调用。
#define square(n) (n*n) main() {int i=1; i=1 while(i<=10) while(i<=10) printf(“% n”,square(i++)); printf(“%d\n”,square(i++)); } type test.i test. main() {int i=1; i=1 while(i<=10) while(i<=10) printf(“% n”,(i++*i++)); printf(“%d\n”,(i++*i++)); }
6.1.2 带有参数的宏替换
#define area (x) (3.1415926536*x*x) main() { printf(″%f\n″,area(2.5)); } cpp test.c test.c type test.i test.i main() { printf(“%f\n”,(x)(3.1415926536*x*x)(2.5)); }
HELLO A
6.1.1 简单宏替换
8.前面定义的宏名, 则在后面的 #define中可以被 前面定义的宏名,则在后面的#define中可以被 引用。 引用。 例如: 例如: #define PI 3.1415926536 #define PI SQUARE PI*PI
6.1.2 带有参数的宏替换
#define 宏名(参数表) 字符串 宏名(参数表) 其中: 其中:字符串中要包含参数表中指定的参数 例如: 例如 : 要在程序中计算大小不同的圆的面积则 可定义如下的带有参数的宏: 可定义如下的带有参数的宏: #define area(x) (3.1415926536*x*x) 1415926536*x*x) main() { printf(“% n”,area(2 )); printf(“%f\n”,area(2.5)); }
相关文档
最新文档