预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。
条件编译有三种形式,下面分别介绍:
1. 第一种形式:
#ifdef 标识符
程序段 1
#else
程序段 2
#endif
它的功能是,如果标识符已被 #define 命令定义过则对程序段 1 进行编译;否则对程序段 2 进行编译。如果没有程序段 2(它为空),本格式中的#else 可以没有,即可以写为:
#ifdef 标识符
程序段
#endif
【例】
#include<stdio.h>
#include<stdlib.h>
#define NUM ok
int main() {
struct stu {
int num;
char *name;
char sex;
float score;
} *ps;
ps = (struct stu*)malloc(sizeof(struct stu));
ps->num = 102;
ps->name = "Zhang ping";
ps->sex = 'M';
ps->score = 62.5;
#ifdef NUM
printf("Number=%d\nScore=%f\n",ps->num,ps->score);
#else
printf("Name=%s\nSex=%c\n",ps->name,ps->sex);
#endif
free(ps);
return 0;
}
由于在程序的第 16 行插入了条件编译预处理命令,因此要根据 NUM 是否被定义过来决定编译那一个printf 语句。而在程序的第一行已对 NUM 作过宏定义,因此应对第一个 printf 语句作编译故运行结果是输出了学号和成绩。
在程序的第一行宏定义中,定义 NUM 表示字符串 OK,其实也可以为任何字符串,甚至不给出任何字符串,写为:
#define NUM
也具有同样的意义。只有取消程序的第一行才会去编译第二个 printf 语句。读者可上机试作。
2. 第二种形式:
#ifndef 标识符
程序段 1
#else
程序段 2
#endif
与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是,如果标识符未被#define 命令定义过则对程序段 1 进行编译,否则对程序段 2 进行编译。这与第一种形式的功能正相反。
3. 第三种形式:
#if 常量表达式
程序段 1
#else
程序段 2
#endif
它的功能是,如常量表达式的值为真(非 0),...
掌握本节内容
登录后开始许愿
暂无评论,来抢沙发