第八章 编译预处理

第八章 编译预处理
第八章 编译预处理

第九章编译预处理

预处理功能主要有三种:宏定义;文件包含;条件编译。

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

#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

{ k=I;

for(j=I+1;j

#ifdef ASCEND

if(a[j]

#else

if(a[j]>a[k])

#endif

k=j;

t=a[k];

a[k]=a[I];

a[I]=t;

}

}

如果在主程序中定义了宏ASCEND则排序时按升序排列,否则按降序排列。

相关主题
相关文档
最新文档