开发前奏c语言第13天_第1页
开发前奏c语言第13天_第2页
开发前奏c语言第13天_第3页
开发前奏c语言第13天_第4页
开发前奏c语言第13天_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言第13天课程大纲预处理指令基本概念【理解】C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译为了区分预处理指令和一般的C语句,所有预处理指令都以符号“#”开头,并且结尾不用分号预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾。习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件C语言提供的预处理指令主要有:宏定义、文件包含、条件编译预处理所处的阶段【理解】预处理:是指编译之前做的事,所以也叫编译预处理宏定义基本概念【理解】被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。宏定义可以分为2种:不带参数的宏定义带参数的宏定义不带参数的宏定义【掌握】1.一般形式#define宏名

字符串“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令“define”

为宏定义命令“标识符”为所定义的宏名“字符串”可以是常数、表达式、格式串比如

#defineABC10右边的字符串也可以省略,比如#defineABC2.作用它的作用是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常用来定义常量。练习接下来写个程序根据圆的半径计算周长不带参数宏定义使用习惯与注意【理解】1>宏名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误2>对程序中用双引号扩起来的字符串内的字符,不进行宏的替换操作。比如:3>在编译预处理用字符串替换宏名时,不作语法检查,只是简单的字符串替换。只有在编译的时候才对已经展开宏名的源程序进行语法检查4>宏名的有效范围是从定义位置到文件结束。如果需要终止宏定义的作用域,可以用#undef命令5>定义一个宏时可以引用已经定义的宏名#define和typedef的区别应注意用宏定义表示数据类型和用typedef定义数据说明符的区别。宏定义只是简单的字符串代换是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符起一个新的名字带参数的宏定义【掌握】C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。带参数宏定义格式:#define宏名(参数列表)字符串带参宏调用的一般形式为:宏名(实参表)带参数宏定义的使用【掌握】在编译预处理时,将源程序中所有宏名替换成字符串,并且将字符串中的参数用宏名右边参数列表中的参数替换.练习【掌握】使用有参宏实现判断两个数的大小使用注意【理解】1>宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串.2>在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。这是与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”。而在带参宏中,只是符号代换,不存在值传递的问题。使用注意【理解】3>在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。4>在宏定义中,字符串内的形参通常要用括号括起来以避免出错。在上例中的宏定义中(y)*(y)表达式的y都用括号括起来,因此结果是正确的。

#defineSQUARE(y)

(y)*(y)使用注意【理解】4>计算结果最好也使用小括号括起来,以避免出错解方案:#define

SUM(x,y)

((x)

+

(y))使用注意【理解】5》宏定义的字符串可以是多条语句,在宏调用时,把这些语句又代换到源程序内与函数的区别【理解】从整个使用过程可以发现,带参数的宏定义,在源程序中出现的形式与函数很像。但是两者是有本质区别的:1>宏定义不涉及存储空间的分配、参数类型匹配、参数传递、返回值问题2>函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行。所以带参数的宏比函数具有更高的执行效率为什么要使用条件编译【了解】

1)按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。有利于程序的移植和调试。2)条件编译当然也可以用条件语句来实现。但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2,生成的目标程序较短。使用普通的if目标文件所占的存储空间【了解】条件编译#if【理解】第一种形式格式与if语句相似格式:#if常量表达式1

程序段1#elif常量表达式2程序段2

….

#else

程序段n

#endif它的功能是,如常量表达式的值为真(非0),则编译程序段1,否则检查常量表达式2,如果成了则编译程序段2,否则检查其他#elif后面的表达式,如果都不成立则编译#else后面程序段n。因此可以使程序在不同条件下,完成不同的功能。注意:必须以#if开头以#endif结尾只能用于常量表达式(常量和宏定义),也就说表达式不能包含变量举例【理解】条件编译#ifdef【理解】

#ifdef语义:表示如果定义某个宏格式#ifdef标识符程序段1#else

程序段2#endif语义:如果标识符已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。本格式中的#else可以省略,即可以写为:#ifdef标识符程序段#endif举例【理解】条件编译#ifndef【理解】

#ifndef语义:如果没有定义某个宏格式#ifndef标识符程序段1#else

程序段2#endif语义:如果标识符没有被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。本格式中的#else可以省略,即可以写为:#ifdef标识符程序段#endif条件编译的使用场景【理解】更方便地打印调试信息如果是调试阶段使用可变参数宏Log的地方可以输出调试日志信息如果不是调试阶段使用Log的地方不会输出调试日志因为在调试阶段Log会被编译后面的printf语句,而在非调试阶段Log宏会被编译成“空”可变参数宏定义说明:这里,‘...’指可变参数。这类宏在被调用时,##表示成零个或多个参数,包括里面的逗号,一直到到右括弧结束为止。当被调用时,在宏体(macrobody)中,那些符号序列集合将代替里面的__VA_ARGS__标识符。#defineDEBUG1#ifDEBUG==0//可变参数宏定义:format是格式控制,##表示可以没有参数,__VA_ARGS__表示可变参数列表#defineLog(format,...)printf(format,##__VA_ARGS__)#else#defineLog(format,...)#endif什么是预处理指令【了解】预处理指令是以#号开头的指令。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换常见的预处理指令如下【理解】

static与extern对局部变量的作用【了解】static对局部变量的作用延长局部变量的生命周期,从程序启动到程序退出,但是它并没有改变变量的作用域定义变量的代码在整个程序运行期间仅仅会执行一次extern用在函数内部

不是定义局部变量,它用在函数内部是声明一个全局变量static全局变量的作用【了解】

全局变量分类:内部变量:只能在本文件中访问的变量外部变量:可以在其他文件中访问的变量,默认所有全局变量都是外部变量static对全局变量的作用声明一个内部变量static

int

a;定义一个内部变量static

int

a

=

10;由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

extern对全局变量的作用【理解】extern作用完整声明一个外部变量extern

int

a;完整定义一个外部变量extern

int

a

=

10;如果声明的时候没有写extern那系统会自动定义这个变量,并将其初始化为0如果声明的时候写extern了,那系统不会自动定义这个变量。static与extern对函数的作用【了解】内部函数:只能在本文件中访问的函数外部函数:可以在本文件中以及其他的文件中访问的函数默认情况下所有的函数都是外部函数static作用声明一个内部函数staticintsum(intnum1,int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论