新课件11.编译预处理

上传人:E**** 文档编号:91017783 上传时间:2019-06-20 格式:PPT 页数:33 大小:399KB
返回 下载 相关 举报
新课件11.编译预处理_第1页
第1页 / 共33页
新课件11.编译预处理_第2页
第2页 / 共33页
新课件11.编译预处理_第3页
第3页 / 共33页
新课件11.编译预处理_第4页
第4页 / 共33页
新课件11.编译预处理_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《新课件11.编译预处理》由会员分享,可在线阅读,更多相关《新课件11.编译预处理(33页珍藏版)》请在金锄头文库上搜索。

1、第十一章 预处理,本章目标,本章概述 讲述宏定义的标准用法 了解预编译的概念,掌握宏定义的方法。 了解“文件包含”与预处理的应用。 了解条件编译的几种形式。 本章目标 了解一些C语言特殊的宏定义 重点 宏定义操作,本章结构,编译预处理,编译预处理和位运算,文件包含,宏定义,条件编译,预处理其他关键词,1 编译预处理与位运算,编译预处理 宏定义 文件包含 条件编译 其他预处理关键字,1.1编译预处理,作用:对源程序编译之前做一些处理,生成扩展C源程序 种类 宏定义 #define 文件包含 #include 条件编译 #if-#else-#endif等 其他宏定义 #line #error #p

2、ragma 格式: “#”开头 占单独书写行 语句尾不加分号,1.2 宏定义,undef 无参数宏定义 有参数宏定义,1.2.1 undef,undef定义指令删除前面定义的宏名字。 表达一般形式为: #undef macro-name 例子 define MICRO 1 undef MICRO,1.2.2 无参数宏定义,如 if(x=YES) printf(“correct!n”); else if (x=NO) printf(“error!n”); 展开后: if(x=1) printf(“correct!n”); else if (x=0) printf(“error!n”);,不带参数

3、宏定义 一般形式: #define 宏名 宏体 功能:用指定标识符(宏名)代替字符序列(宏体),如 #define YES 1 #define NO 0 #define PI 3.1415926 #define OUT printf(“Hello,World”);,宏体可缺省,表示宏名 定义过或取消宏体,例 #define MAX MAX+10 (),例 #define PI 3.14159 printf(“2*PI=%fn”,PI*2); 宏展开:printf(“2*PI=%fn”,3.14159*2);,例 #define WIDTH 80 #define LENGTH WIDTH+40

4、var=LENGTH*2; 宏展开:var= 80+40 *2;,1.2.2 不带参数宏定义,宏定义的规则 宏名一般习惯用大写字母表示,以便与变量名相区别 宏定义不是C语句,不必在行末加分号 在进行宏定义时,可以引用已定义的宏名,可以层层替换。 只作字符替换,不分配内存空间。,#define R 3.0 #define PI 3.1415926 #define L (2*(PI)*(R) #define S (PI)*(R)*(R) main() printf(“L=%fnS=%fn”,L,S); ,结果: L = 18.849556 S = 28.274333,1.2.2 不带参数宏定义,宏

5、定义的特点 宏名一般习惯用大写字母表示 提高程序的通用性 宏名的有效范围为定义命令之后到本源文件结束 可以用#undef命令终止宏定义的作用域 宏定义只作简单的替换,不作正确性检查,1.2.3 带参数宏定义,一般形式: #define 宏名(参数表) 宏体,例 #define S (r) PI*r*r 相当于定义了不带参宏S,代表字符串“(r) PI*r*r”,宏展开:形参用实参换,其它字符保留 宏体及各形参之间应加空格 注意宏体的括号,例 #define S(a,b) a*b area=S(3,2); 宏展开: area=3*2;,不能加空格,例 #define POWER(x) x*x x

6、=4; y=6; z=POWER(x+y); 宏展开:z=x+y*x+y; 一般写成: #define POWER(x) (x)*(x) 宏展开: z=(x+y)*(x+y);,1.2.3 带参数宏定义,带参数宏定义的特点 带参宏定义中,宏名和形参表之间不能有空格出现 例如: #define S(a, b) a*b 写为: #define S (a, b) a*b 将被认为是无参宏定义,宏名S代表字符串 (a, b) a*b 在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式 在宏定义中,字符串内的形参通常要用括号括起来以避免出错

7、,#define SQ(y) (y)*(y) main() int a,sq; printf(“input a number: “); scanf(“%d“, ,1.2.3 带参数宏定义,带参的宏和带参函数很相似,但有本质上的不同,1.2.3 带参数宏定义,带参的宏和带参函数很相似,但有本质上的不同,宏定义例,函数例,main() int i=1; while(i=5) printf(“%dn“,SQ(i+); SQ(int y) return(y)*(y); ,#define SQ(y) (y)*(y) main() int i=1; while(i=5) printf(“%dn“,SQ(i

8、+); ,1.2.3 宏与命令行参数,同一源文件,编译不同版本时: int array ARRAY_SIZE ; 编译时: gcc -DARRAY_SIZE filename.c -o filename gcc -DARRAY_SIZE=10 filename.c -o filename 注: 在文件中不能用define重复宏定义 -Uname 删除符号定义,1.3 文件包含,函数例,功能:一个源文件可将另一个源文件的内容全部包含进来 一般形式: #include “文件名” 或 #include ,处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译,

9、 直接按标准目录搜索 “” 先在当前目录搜索,再搜索标准目录,1.3 文件包含,被包含文件内容 源文件(*.c) 头文件(*.h),宏定义 数据结构定义 函数说明等,文件包含可嵌套,1.3 文件包含,例子,1.3 文件包含,文件包含特点 一个include命令只能指定一个被包含文件 可以用双引号括起来,也可以用尖括号括起来。 文件包含允许嵌套 被包含文件(file2.h)与其所在的文件(file.c)在预编译之后已成为同一个文件,1.4 条件编译,#if、#else、#elif #endif #ifdef和#ifndef,1.4.1 #if、#else、#elif #endif,条件编译指令中

10、最常用的或许是#if, #else, #elif和#endif #if的一般形式是: #if constant-expression Statement sequence #endif #endif标记#if块的结束 注: constant-expression 必须为常量表达式: 字面值常量 #define定义的符号,1.4.1 #if、#else、#elif #endif,#else指令的作用与C语言的else相似,#if指令失败时它可以作为备选指令 #else既是标记#if块的结束,也标记#else块的开始 每个#if只能写一个#endif匹配 例子:,#include #define

11、MAX 100 Int main(void) #if MAX99 printf(“Compiled for array greater than 99.n”); #else printf(“Complied for small array.n”); #endif return 0; ,1.4.1 #if、#else、#elif #endif,#elif指令的意思是“否则,如果” 语法格式: #if expression Statement sequence #elif expression1 Statement sequence #elif expression2 。 #elif expres

12、sion Statement sequence #endif,1.4.2 #ifdef和#ifndef,#ifdef 如果已定义 #ifdef的一般形式如下: #ifdef 标识符 程序段1 #else 程序段2 #endif 当所指定的标识符已经被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2。 例子: #ifdef COMPUTER_A #define INTEGER_SIZE 16 #else # define INTEGER_SIZE 32 #endif,1.4.2 #ifdef和#ifndef,#ifndef 如果已定义 #ifdef的一般形式如下: #i

13、fndef 标识符 程序段1 #else 程序段2 #endif 作用是当所指定的标识符未被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2。它只是第一行与第一种形式不同。这种形式与第一种形式的作用相反#ifndef,1.4.2 #ifdef和#ifndef,#ifdef和#ifndef,#inlucde #define T 10 int main(void) #ifdef t Printf(“Hi Tn”); #else Printf(“Hi anyonen”); #endif #ifndef M Printf(“M Not Definedn”); #endif r

14、eturn 0; ,1.4.2 #ifdef和#ifndef,#if 如果真,则编译 #if 的一般形式如下: #if 常量表达式 程序段1 #else 程序段2 #endif 如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译,1.4.2 #ifdef和#ifndef,#if 例子,#define R 1 main() float c,r,s; printf (“input a number: “); scanf(“%f“, #endif ,阶段小节,宏定义的特点和宏定义的取消 带参数宏定义要注意的几个细节 条件编译主要应用在那几个方面,它有几种使用方法 Inclu

15、de 包含文件的两种方法和他们之间的区别特点,1.5.6 预定义宏,_DATE_ 进行预处理的日期(“Mmm dd yyyy”形式的字符串文字) _FILE_ 代表当前源代码文件名的字符串文字 _LINE_ 代表当前源代码中的行号的整数常量 _TIME_ 源文件编译时间,格式微“hh:mm:ss” _func_ 当前所在函数名,1.5.7 预定义宏,例子,#include #include void why_me(); int main() printf( “The file is %s.n“, _FILE_ ); printf( “The date is %s.n“, _DATE_ ); printf( “The time is %s.n“, _TIME_ ); printf( “This is line %d.n“, _LINE_ ); printf( “This function is %s.n“, _func_ ); why_me(); return 0; ,void why_me() printf( “This function is %sn“, _func_ ); printf( “The file is %s.n“, _FILE_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号