TAG:
预编译和宏定义,ANSI C,#define命令
TEXT:
在介绍符号常量定义之前,首先分析如下的程序。
例11-1 输入全班20个同学的C语言成绩,并计算出最高分同学的姓名和成绩,并计算出全班C语言成绩的平均分。
#include "stdio.h"
void main()
{
float fAvg; /*
平均成绩 */
float fMax; /*
最高成绩 */
int iMax;
float fSum;
int i;
/*C
语言成绩(20人) */
float fCScore[20]={78.5,65,89,65,45,62,89,99,85,85, 100,58,98,86,68,66,85.5,89.5,75,76};
/*
全班同学的姓名(20人) */
char chNames[][20]= { "Maofen","LiuTao","Wangyu","Songbou", "Liyang", "Wangming","Renhon", "Wuyong","Luming","Sunce","Zhangjie","Yuanquan", "Yangjing","Yubing","XingWen","Huangxing","Dingwen","Quyang","Liufeng","Hanhan"
};
/*
计算总分*/
fSum=0;
for(i=0;i<20;i++)
fSum=fSum+fCScore[i];
/*
计算平均分*/
fAvg =fSum/20;
/*
计算最高分*/
fMax = fCScore[0];
iMax=0;
for(i=0;i<20;i++)
{
if(fMax<fCScore[i])
{
iMax=i;
fMax= fCScore[i];
}
}
/*
输出信息*/
printf("/nThe Score of C Programming Language/n");
printf("The first is %10s /n",chNames[iMax]);
printf("The Score is %10.2f /n",fCScore[iMax]);
printf("The Average is %10.2f /n",fAvg);
}
在上面的程序中,20是一整型常量,代表全班同学的总人数。根据求解问题的需要,20出现了多次。如果将此程序修改,以便处理一个具有25个同学的班级,则需要进行多处的改动。在实际的软件开发中,一个简单的常量可能在整个软件的不同部分出现上百次或上千次,并可能代表不同的信息。在移植过程中,采用手工修改,十分容易出现错误。因此C语言中引入了符号常量,形式如下:
#define
符号常量名称 替换文本
其中#define 为预编译命令,“替换文本”为“符号常量”所代表的字符序列集合,可以为任意字符的组合。在程序代码被编译之前,编译系统自动将所有符号常量出现的位置,被其代表的“替换文本”无条件的替换,然后再进行语法检查和编译。因此利用符号常量,例11-1可改写为
#include "stdio.h"
#define STUDENT_COUNT 20
void main()
{
……
/*C
语言成绩(20人) */
float fCScore[STUDENT_COUNT ]={
…};
char chNames[][STUDENT_COUNT ]={
…};
fSum=0;
for(i=0;i<STUDENT_COUNT;i++)
fSum=fSum+fCScore[i];
fAvg =fSum/STUDENT_COUNT ;
…
for(i=0;i<STUDENT_COUNT ;i++)
{
……
}
}
为了节省空间,上述程序仅仅显示了修改后的部分。结合例11-1,将所有20用STUDENT_COUNT替换即可。其中
#define STUDENT_COUNT 20
是定义符号常量STUDENT_COUNT,其替换文本为20,代表20这样一个字符序列集合,在程序编译时,所有STUDENT_COUNT出现的位置均被20 无条件的替换。
如果将上述程序修改为处理具有30位同学的班级,只需修改定义
#define STUDENT_COUNT 30
即可。从上面的分析可以看出,恰当的使用符号常量可以增强程序的可移植能力。
提示 符号常量出现的位置,最终将无条件替换为其代表的字符序列集合,并不做语法检查。在编译程序时再进行语法检查。另外,符号常量定义的末尾不能有分号,与普通的程序语句不同。
符号常量的所带代表字符序列集合,可以为空,形式如下:
#define
编译标志
此命令的主要用途是引入编译标志,根据不同的编译标志,编译系统可以完成对不同代码段的编译。例如下面的程序
例11-2 在Windows系统中int 为32位数,在Dos中long为32位数。为了程序在两个系统中移植,可以定义INT32,保证在两种系统中利用INT32声明的变量为32位整型数。
#include "stdio.h"
#ifdef MY_DOS
#define INT16 int
#define INT32 long
#endif
#ifdef MY_WIN32
#define INT16 short
#define INT32 int
#endif
void main()
{
INT32 a;
a=32;
printf("%ld",a);
}
其中MY_WIN32和MY_DOS为编译标志,本段程序的主要目的是保证INT32类型数总是32位的整型数,在DOS系统中编译的时候增加代码
#define MY_DOS
此时INT32代表long。
在Windows系统下编译的时候,修改为
#define MY_WIN32
此时INT32代表int。
提示 符号常量与变量常常混淆。符号常量是一个有名字,因此其与变量相似,但是其值在程序运行过程中不能更改,与常量类似。
一般符号常量的名称采用大写字母,用于区分变量。
将常用的常量定义为符号常量是一种良好的设计习惯。
REF:.txt