计算机c语言的预处理,计算机C语言教程第8章预处理

《计算机C语言教程第8章预处理》由会员分享,可在线阅读,更多相关《计算机C语言教程第8章预处理(22页珍藏版)》请在人人文库网上搜索。

1、目的: 为了简化程序的编写,提高程序的可移植性、可读性、模块化。 C语言 设计了若干命令编译预处理命令,并可出现于程序当中。 处理流程: 第一次编译扫描时,将预编译命令处理完,然后再进行正式编译,生成 目标代码。 1. 宏定义命令; 有三种类型的预处理命令: 为了与C语句区别,这些命令均以“#”开头。 2. 文件包含命令; 3. 条件编译命令。 8.1 宏定义宏定义 简化程序的书写,提高可读性、可移植性。 一、无参数形式 # define 标识符 字符串表达式 宏定义分为: 无参数和有参数二种形式。 #include #define L (x*x + 2*x + x) main() int x。

2、, y; printf(“ input a number:” ); scanf(%d, y=L*L + 2*L + 10; printf(y=%d n, y); 例如:例如: 上例中,#define L (x*x+2*x+x),在yL*L+2*L+10;中作 了宏调用。在预处理时经宏展开后该语句变为: y(x*x+2*x+x)*(x*x+2*x+x)+2*(x*x+2*x+x)+10; 注意几点: (1) 宏定义是用宏名来表示一个字符串,在宏展开时又以 该字 符串取代宏名,只是一种简单的代换。 (2) 宏定义不是说明或语句,在行末不加分号。 (3) 宏定义必须写在函数之外,其作用域为宏定义命 。

3、令起到源程序结束。 (4) 用引号括起来的宏名,预处理程序不对其作宏代换。 (5)宏定义允许嵌套,在宏定义的字符串中可以使 用已经定义的宏名。在宏展开时由预处理程序层层代 换。 (6)宏名一般用大写字母表示,以便于与变量区别。 二、有参形式 合适于字符串表达式序列中有变化的字符,将这部分字符 可定义为参数。 #define宏名宏名(形参表形参表)字符串字符串 带参宏定义的一般形式为: 例如例如: #define L(x)(x*x+2*x+x) /*带参数宏定义*/ 宏调用:y=L(5); 在宏调用时,用实参5去代替形参x,经预处理宏展开 后的语句为: y=(5*5+2*5+5); 例例 : #。

4、include #define MAX(a,b)(ab)?a:b main() int x,y,max; scanf(%d%d, max=MAX(x,y); printf(max=%d n,max); 说明:说明: 上例程序中,表达式 (ab)?a:b 由宏名MAX表示,形参a,b 均出现在条件表达式中。程序中: max=MAX(x,y); 为宏调用,实参x,y将代换形参a,b。宏展开后该语句为: max=(xy) ? x:y; 注意几点:注意几点: (1)宏定义中,宏名和形参表之间不能有空格出现。 例如:#define MAX (a,b)(ab)?a:b 将被认为宏名MAX代表的 字符串是 。

5、(a,b)(ab)?a:b,是无参宏定义。 (2)在带参宏定义中,形式参数不同于函数中的形参,带参宏 定义中的参数不是变量,只是在宏调用时用实参的符号去代换 形参,即只是符号代换。所以,不存在值传递的问题。 (3)在宏定义中的形参是标识符,而宏调用中的实参可以是 表达式。 (4)在宏定义中的形参最好用括号括起来,以避免出错。如 果去掉上例中(y)*(y)表达式的括号,宏代换后将得到以下语句: y=sin(x)+l*sin(x)+l; 显然,展开后的表达式与题意相违。为了保证宏代换的正确 性,应该给宏定义中的表示表达式的字符串加上括号,如: #define L(x)(x)*(x)+2) 宏调用:。

6、 y=lL(a+5); 宏代换后: yl(a+5)*(a+5)+2); 如果字符串没有加上括号,宏代换后会得到完全不同的表达式: y=l(a+5)*(a+5)+2; (5)带参宏与带参函数的区别。 8.2 文件包含文件包含 C语言允许在一个文件预编译时,将另一个文件原封不 动地包含进来。 目的: 当函数不在一个文件中,既可用link连接编译后的obj 文件,也可用“ 文件包含”方式。 当一组符号常量的定义为公用时,可作为一个独立的 文件被其它文件包含。 格式: # include 文件名 # include f2.c main ( ) 例: f1.c f2.c : : : : 预编译后: : 。

7、: main ( ) f1.c 为f2.c中的内容 再进行正式编译 1. 一个include只能写一个文件,包含多个文件需多个 include 只在f1.c中用#include. #include f2.c #include f3.c 分别在f1.c, f2.c中用#include 在f1.c中: #include f2.c 在f2.c中: #include f3.c 2. 当f1.c包含f2.c,而f2.c又包含f3.c时,有两种包含形式: 3. 一般用 .h 扩展名命名被包含文件。 h为head之意以与一 般 .c 文件区别。如系统stdio.h.系统 .h 文件在子目录 INCLUDE下。

8、。 4. #include后的文件名既可用 , 也可用,两者区别: “ ”首先在当前目录中找,然后再去标准目录中找。 只在标准目录(include目录)中找。 5. 被包含文件和包含文件最后形成一个文件。因此,全局变 量作用域为整个文件。不必用extern说明。 8.3 条件编译条件编译 有时,C程序的一部分语句是否起作用要根据一定的条件, 即由条件而决定是否起作用。 例如: 调试程序时,需加多条printf,但调试完则要一一删除。 有的语句也视条件而决定其具体形式。 形式1 # ifdef 标识符 程序段1 # else 程序段2 # endif 条件编译命令的三种形式: 功能 当标识符在此。

9、之前被定义过 (即用#define定义过),则 编译程序段1,否则编译程序段2。 其中: 程序段即可为语句组,也可为命令行。 例: 为了调试程序,加上以下条件编译 # ifdef DEBUG printf(x=%d, y=%d, z=%d,x, y, z ); # endif 另: #else 后面部分可没有,但#endif保留。 只要在此之前有: # define DEBUG 则编译 printf( x=%d, y=%d, z=%d, x, y, z); 例例:/*-exp11_5.c-*/ include define EN printf(Please input number:n) ma。

10、in( ) int a=123, b=456; #ifdef EN prinft(This is test :a=%dn, a); #else prinft(This is test :b=%dn, b); #endif 编译时会有警告:编译时会有警告: b is assigned a value that is never used 运行结果运行结果:This is test :a=123 形式2 #ifndef 标识符 程序段1 #else 程序段2 #endif 功能: 与形式1的条件正好相反, 即: 当标识符未被定义,则 编译程序段1, 否则编译程序段2。 例例:/*-exp11_5.。

11、c-*/ include define EN printf(Please input number:n) main( ) int a=123, b=456; #ifndef EN prinft(This is test :a=%dn, a); #else prinft(This is test :b=%dn, b); #endif 编译时会有警告:编译时会有警告: a is assigned a value that is never used 运行结果运行结果:This is test :b=456 形式3 #if 表达式 程序段1 #else 程序段2 #endif 功能: 当表达式0,则。

12、编译程序段1,否则编译程序段2。 例例: 输入一任意字符串,需将其全部转化为大写字母,或者 将其转化为小写字母。 只编一个程序, 程序中用条件编译,决定 是全部转为大写字母还是小写字母。 i=0; while ( (c=str i) != o) # if LETTER if (c= a #endif printf( str%d=%c, i, c); i+; #define LETTER 1/0 main( ) char str5; int i=0; for(i=0; i=5; i+) scanf(%s, 程序运行后,若输入:aBcDE 则运行结果为: str0=a str1=b str2=c str3=d str4=e。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值