文档介绍:第八章
2017/11/10
1
本章教学要点
预处理的概念
不带参宏定义
带参宏定义
文件包含
C程序设计教程---------- a./
2017/11/10
2
主要内容
宏定义
文件包含
条件编译
2017/11/10
3
基本概念
在C源程序中加入一些“预处理命令”,可以改善C语言的程序设计环境,提高编程效率。
例如,若程序中用#define命令定义了符号常量PI。
#define PI
经过预处理后程序可由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。其基本处理过程如图:
C提供的预处理功能主要有以下三种:
(1)宏定义
(2)文件包含
(3)条件编译
这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“#”开头。
例如:
#define
#include
基本概念
宏定义
不带参数的宏定义
宏名后不带参数的宏定义是用一个指定的标识符来代表一个字符串。
一般形式: #define 标识符字符串
宏定义
不带参数的宏定义示例。
#include <>
#define M (x*x+2*x-1)
void main()
{ int x,y;
printf("input a number:");
scanf("%d",&x);
y= x*M+2*M+1;
printf("y=%d\n",y); }
程序运行结果:
input a number: 2 ↙
y=29
在预处理时经宏替换后该语句变为:
y=x*(x*x+2*x-1)+2*(x*x+2*x-1)+1; /*即y=x3+4x2+3x-1*/
宏定义
例如,当进行如下的宏定义:
#difine M x*x+2*x-1
在宏替换后将得到下述语句:
Y=x*x*x+2*x-1+2*x*x+2*x-1+1;
/*这相当于y= x3+2x2+4*x-1;*/
宏定义
对于宏定义还要说明以下几点:
(1)宏定义是用标识符(宏名)来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的替换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。
(2)宏定义不是声明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
(3)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如果要终止其作用域,可使用#undef命令。
(4)宏名如果在源程序中若用引号括起来,则预处理程序不对其作宏替换。
(5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层替换。
例如:
#define PI
#define S PI*y*y /* PI是已定义的宏名*/
对语句: printf("%f",S);
在宏替换后变为:
printf("%f",*y*y);
宏定义