Chinaunix首页 | 论坛 | 博客
  • 博客访问: 399613
  • 博文数量: 119
  • 博客积分: 1470
  • 博客等级: 上尉
  • 技术积分: 1258
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-24 13:50
文章分类

全部博文(119)

文章存档

2018年(6)

2017年(11)

2016年(4)

2013年(8)

2012年(1)

2011年(2)

2010年(4)

2009年(37)

2008年(16)

2006年(30)

我的朋友

分类: C/C++

2006-09-13 16:13:52

编译预处理是指在编译程序对C源程序进行编译之前,先对程序正文进行预处理,分为宏定义#define#undef文件包含#include及条件编译#if#else#ifdef#ifndef#elif#endif

101宏定义

宏定义是:通过#define指令来将一个标识符与一个字符串关联起来,即用标识符来代替该字符串,这个字符串称为宏名。

宏定义指令:#define,终止宏定义指令#undef

分为:带参数宏定义和不带参数宏定义

1011 不带参数的宏

宏定义格式:#define 标识符 替换字符串

说明:

1、宏定义一般放在程序开头,用来定义符号常量;习惯上将“标识符”大写,称为宏名;宏定义是指令,不是语句,所以后面不能有分号。

2、编译预处理将程序中“标识符”替换成后面“替换字符串”。

宏定义的直接应用之一是在表示数组大小时,能使其大小易于修改。

[课件展示命令格式及相关例子]

例:#define TRUE 1          /*预编译将程序中TRUE 换成1*/

#define FALSE 0         /*预编译将程序中FALSE 换成0*/

#define MAXSIZE 80     /*修改80,可改变数组大小*/

…..

char buffer[MAXSIZE]

删除宏格式:#undef 宏名

例:#define MAXSIZE 80

…..

#undef MAXSIZE         /* MAXSIZE以后不再有效 */

1012带参数的宏

1、带参数的宏定义格式:#define 宏名(形式参数列表) 替换字符串

说明:形参列表用逗号分隔。

2、带参数的宏调用格式:宏名(实际参数列表)

说明:预编译将实参代替形参,再替换(与简单函数类似)。

10-1


1、宏定义是预编译时处理,而函数调用是程序运行时进行。

2、宏定义实参代替形参是简单的字符串替换,函数调用是将实参值或地址传递给形参

3、实参若为表达式,函数调用只求值一次,宏定义替换时求值可能不止一次

  通过例10-2、例10-3说明区别3 [课件展示区别3]

4、函数只有一个返回值,而宏可有多个返回值

  10-4[课件展示说明区别4]

带参数的宏删除格式:#undef 宏名

例:#define ABS(x) ((x)<0?-(x):(x))

    ….

    #undef ABS

102文件包含

作用:将指定的文件内容包含到当前文件中,在程序开头使用指令#include

格式一:#include <文件名>

说明:包含系统目录(如:INCLUDE)中指定的文件(一般用于包含系统提供的头文件)。

格式二:#include “文件名

说明:包含当前目录或系统目录中指定的文件(先在当前目录中找,一般用于包含自定义的头文件)。

注意两种格式的区别。

例:#include

#include “mydef.h”

注意:#include一般用来包含“.h”为后缀的头文件,预编译将此文件插入到当前位置。多个文件包含需用多个#include指令。

例:#include

#include

#include “mydef.h”

…..

文件包含指令可以嵌套使用(一个被包含文件中,可以包含另一个被包含文件)。

例:p143[课件展示]

103条件编译

条件编译概念:按照不同的条件去编译程序不同的部分,从而生成不同的目标代码,以实现程序的不同功能。

条件编译的用途:可构造多种条件下运行的程序,提高程序的通用性和可移移植性,                便用程序的调式与纠错,大型C程序,经常使用条件编译。

与条件编译相关预处理指令有:#if#else#ifdef#ifndef#elif#endif

条件编译指令使用形式:

1#if的使用方法[课件展示命令的两种形式]

形式(1):#if 常量表达式

                  程序段1

          #else               /*此部分可以没有*/

                  程序段2

          #endif

功能:常量表达式为真,编译程序段1,否则编译程序段2

10-5[课件展示]

形式(2):#if 常量表达式1

                  程序段1

          #elif常量表达式 2        /*可有多个#elif */

                  程序段2

          #else             

                  程序段3

          #endif

功能:常量表达式1为真,编译程序段1;若常量表达式1为假,而常量表达式2为真,编译程序段2;其它,编译程序段3

2#ifdef的使用方法

格式:#ifdef  标识符

                程序段1

      #else               /*此部分可以没有*/

                程序段2

      #endif

功能:若标识符已被定义(通常用#define,则编译程序段1,否则编译程序段2

10-6[课件展示]

3#ifndef的使用方法

格式:#ifndef  标识符

                程序段1

      #else               /*此部分可以没有*/

                程序段2

      #endif

功能:若标识符未被定义(通常用#define,则编译程序段1,否则编译程序段2

10-7[课件展示]

p148[课件展示]

 

小结:

本节讲了三种预编译处理:

宏定义是用标识符来代替该字符串,这个字符串称为宏名;

文件包含是将指定的文件内容包含到当前文件中;

条件编译是按照不同的条件去编译程序不同的部分,从而生成不同的目标代码,以实现程序的不同功能;

要掌握它们在程序中作用,正确的使用它们来增加程序的可读性、灵活性和通用性,减少出错机率。

阅读(835) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~