第九章编译预处理 预处理功能主要有三种:宏定义;文件包含;条件编译 9.1宏替换(宏定义) 91.1不带参数的宏定义 1.# define指令:用一个指定的标识符来代表一个字符串。 2.定义的一般形式是 # define宏名字符串(或数值) 由# define指令定义后,在程序中每次遇到该宏名时就用所 定义的字符串(或数值代替它 W1: #define Pl3. 14159265 #define radius 2.0 double circum return(2.0*PI"RADIUS double areao i return(PI RADIUS"RADIUS) main( i printf("l=%ofn"circum) printf("s%lf\n", areao) 注意 ①在宏定义的后面没有";"(因为它不是语句) ②习惯上用大写字符作为宏名,与变量名相区别,而且常放在程 序开头。 ③使用宏名代替一个字符串,可以减少程序中重复书写某些字 符串的工作量 #define array size 1000 int arraylattay size ④可以用# undef命令终止宏定义的作用域 #define 8 maino #undefg fIo
第九章 编译预处理 预处理功能主要有三种:宏定义;文件包含;条件编译。 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 r3.0 #define pl3. 1415926 #define l 2*pir #define s pir*r main( printf( L=%fns=%fn",L, S); ⑥在程序中用双引号括起来的字符串骨近字符,与宏名相同 不进行置换,作为字符串。 91.2带参数的宏定义 1.# define宏名(参数)字符串 不是进行简单的字符串替换,还要进行参数替换。 例2 #define MAX(x, y)((x)>(y)?():(y) maino nt=10,=15 A printf("The Maxmum is %d", MAX(,D); 展开相当于: printf("The Maxmum is %d", ((1)>(j)?(1:j)); 9.2.“文件包含”处里(# include) 1.定义:# include指令的作用是指示编译器将该指令所指出 的另一个源文件嵌入# include指令所在的程序中其一般形式为 # include 或# include“文件名” 第一种形式:系统到系统标准目录中搜索该文件 第二种形式:首先到当前目录中搜索该文件,如找不到则到系统标 准目录中去搜索该文件 例3:输入一个句子,统计单词个数。 首先编写一个头文件: /hong. h*/ #include #define true 1
…….. ⑤在进行宏定义时,可以引用已定义的宠名,可以层层置换。 例: #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 然后,编写程序,其中 包含该头文件: # include a:thong maino Bint in=0 char str[801 gets(str) for(i=l; stri=0; 1++) if (iswhite(str=TRUE) n++ printf( has %d words",n) nt iswhite(char c) {if(c="|c=="nl|c="t) return TRUE return FALse; 93.条件编译 1.定义:当满足某条件时对一组语句进行编译,而当条件不满 足时则编译另一组语句 2.格式 # ifdef标识符 语句段; #else 语句段 #endif 含义是:当标识符被定义过(用# define定义),则编译#f到#lse 之间的程序段;否则编译#else到# endif之间的程序段 3格式二: # ifndef标识符 语句段 #else 语句段; #endif 4格式三: #if表达式 语句段
#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 它的作用是:当指定的表达式值为非零值,则编译#到#ekse之 间的程序段;否则编译#else到# endif之间的程序段 例4 void s sort(inta[, int n) fint i, j, k, t for(=0;<n-1;H++) ik=l for(=l+l: j<n, j++) #ifdefascend if(alka[kD #else if(alPa[kD #endif k=j a[k]; a[kF=all 如果在主程序中定义了宏 ASCEND则排序时按升序排列,否则 按降序排列
#else 语句段; #endif 它的作用是:当指定的表达式值为非零值,则编译#if 到#else 之 间的程序段; 否则编译#else 到#endif 之间的程序段。 例 4: void s_sort(int a[],int n) {int i,j,k,t; for(I=0;Ia[k]) #endif k=j; t=a[k]; a[k]=a[I]; a[I]=t; } } 如果在主程序中定义了宏 ASCEND 则排序时按升序排列,否则 按降序排列