编译预处理
预处理功能主要有三种:宏定义;文件包含;条件编译。
9.1宏替换(宏定义)
9.1.1不带参数的宏定义
1,#define 指令,用一个指定的标识符来代表一个字符串。
2,定义的一般形式是,
#define 宏名 字符串(或数值)
由#define指令定义后,在程序中每次遇到该宏名时就用所定义的字符串(或数值)代替它。
例1:#define PI 3.14159265
#define RADIUS 2.0
double circum()
{ return(2.0*PI*RADIUS);
}
double area()
{ return(PI*RADIUS*RADIUS);
}
main()
{ printf("L=%lf\n",circum());
printf("S=%lf\n",area());
}
注意,
①在宏定义的后面没有";"(因为它不是语句)
②习惯上用大写字符作为宏名,与变量名相区别,而且常放在程序开头。
③使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量:
#define array_size 1000
int array[attay_size];
④可以用#undef命令终止宏定义的作用域。
#define G 9.8
main()
{
}
#undef G
f1( )
……..
⑤在进行宏定义时,可以引用已定义的宠名,可以层层置换。
例,#define R 3.0
#define PI 3.1415926
#define L 2*PI*R
#define S PI*R*R
main()
{
printf(“L=%f\ns=%f\n”,L,S);
}
⑥在程序中用双引号括起来的字符串骨近字符,与宏名相同,不进行置换,作为字符串。
9.1.2带参数的宏定义
1.# define 宏名(参数) 字符串
不是进行简单的字符串替换,还要进行参数替换。
例2,
#define MAX(x,y) ((x)>(y))?(x):(y)
main()
{
int i=10,j=15;
printf("The Maxmum is %d",MAX(i,j));
}
展开相当于:
printf("The Maxmum is %d",((i)>(j))?(i):(j));
9.2.“文件包含”处里(#include)
1.定义,#include 指令的作用是指示编译器将该指令所指出的另一个源文件嵌入#include指令所在的程序中.其一般形式为:
#include <文件名>
或#include,文件名”
第一种形式:系统到系统标准目录中搜索该文件
第二种形式:首先到当前目录中搜索该文件,如找不到则到系统标准目录中去搜索该文件。
例3,输入一个句子,统计单词个数。
首先编写一个头文件:
/*hong.h*/
#include <stdio.h>
#define TRUE 1
#define FALSE 0
然后,编写程序,其中包含该头文件:
#include "a:\hong.h"
main()
{int i,n=0;
char str[80];
gets(str);
for(i=1;str[i]!='\0';i++)
if (iswhite(str[i])==TRUE)
n++;
printf(“has %d words",n);
}
int iswhite(char c)
{ if(c==''||c=='\n'||c=='\t')
return TRUE;
else
return FALSE;}
9.3,条件编译
1.定义:当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。
2.格式一:
#ifdef 标识符
语句段;
#else
语句段;
#endif
含义是,当标识符被定义过(用#define定义),则编译#if到#else 之间的程序段; 否则编译#else到#endif之间的程序段。
3.格式二:
#ifndef 标识符
语句段;
#else
语句段;
#endif
4.格式三:
#if 表达式
语句段;
#else
语句段;
#endif
它的作用是:当指定的表达式值为非零值,则编译#if到#else 之间的程序段; 否则编译#else到#endif之间的程序段。
例4,
void s_sort(int a[],int n)
{int i,j,k,t;
for(I=0;I<n-1;I++)
{ k=I;
for(j=I+1;j<n;j++)
#ifdef ASCEND
if(a[j]<a[k])
#else
if(a[j]>a[k])
#endif
k=j;
t=a[k];
a[k]=a[I];
a[I]=t;
}
}
如果在主程序中定义了宏ASCEND则排序时按升序排列,否则按降序排列。