8.4.3 #ifdef、#ifndef命令

ifdef与#ifndef命令用于判断宏名是否被定义过,并根据判断的情况进行条件编译。#ifdef命令的一般形式如下。


ifdef宏名

语句段;

else

语句段;

endif


其执行过程是,作为判断语句的#ifdef后面的宏名是标识符。若该标识符被定义过,则编译标识符紧跟的语句段;如果标识符未被定义过,则编译#else命令后面的语句段。

ifndef的一般形式如下。


ifndef宏名

语句段;

else

语句段;

endif


ifndef命令与#ifdef命令的操作恰好相反。其执行过程是,作为判断语句的#ifndef后面的宏名是标识符。若该标识符未被定义过,则编译标识符紧跟的语句段;如果标识符被定义过,则编译#else命令后面的语句段。

使用#ifdef和#ifndef命令的程序示例如下。


include<stdio.h>//头文件

define SCORE 85//宏定义

void main()//主函数

{

ifdef SCORE//条件编译

printf(“SCORE is defined!\n”);//如果宏SCORE存在,则执行该语句

else

printf(“SCORE is not defined!\n”);//如果宏SCORE不存在,则执行该语句

endif

ifndef GREED

printf(“GREED is not defined!\n”);//如果宏GREED存在,则执行该语句

else

printf(“GREED is defined!\n”);//如果宏GREED不存在,则执行该语句

endif

}


该程序可以在KeilµVision3集成开发环境中运行,其结果如下所示。


SCORE is defined!

GREED is not defined!


在本例中,先定义了宏名SCORE,接着在主程序中通过#ifdef和#ifndef命令来判断宏名SCORE和GREED是否被定义过,并打印输出结果。

在C51语言中,使用#ifdef和#ifndef命令需要注意如下几点。

❑#ifdef与#ifndef可以与#else语句联合使用,但不能和#elif联合使用。

❑#ifdef与#ifndef支持嵌套。

❑#ifdef和#ifndef命令中的#else命名及其后面的语句段可以省略。这种情况下,只判断标识符是否定义过,若定义过,则编译#ifdef后的语句;若未定义过,则编译#ifndef后的语句。