一、 #undef
#undef用于去除某一个#define定义的宏或者是标识符
#include<stdio.h>
#define M(a,b) a+b;
//#undef M
int main()
{
int a = M(10,5);
return 0;
}
注释掉#undef:
正常执行。
取消注释后:
编译器无法识别我们的宏,这说明#undef确实是去除掉了M。
二 、#ifdef和#endif
有时候在代码中,我们需要在特定情况下编译某条代码,而不是直接去掉它。
例如,如果在宏已定义的情况下需要编译某条代码,就可以选择用#ifdef和#endif构成一个条件编译指令,具体的格式是:
#ifdef + 宏名称
语句项
#endif
#include<stdio.h>
#define M(a,b) a+b
//#undef M
int main()
{
#ifdef M
printf("1");//M是已定义的宏,正常打印1
#endif
return 0;
}
#include<stdio.h>
#define M(a,b) a+b
#undef M
int main()
{
#ifdef M
printf("1");//使用#undef去除M后,将不打印1.
#endif
return 0;
}
#ifdef有另外三种形式:#if defined ,# if !defined和#ifndef
#include<stdio.h>
#define M(a,b) a+b
//#undef M
int main()
{
#if defined M
printf("1");
#endif
return 0;
}
#include<stdio.h>
#define M(a,b) a+b
//#undef M
int main()
{
#if !defined M
printf("1");
#endif
return 0;
}
#include<stdio.h>
#define M(a,b) a+b
//#undef M
int main()
{
#ifndef M
printf("1");
#endif
return 0;
}
上面三个代码的结果都是一样的,打印1。
当然,条件编译指令也可以嵌套,就像if else语句一样。
二、#include包含头文件
#include包含头文件有两种——一种是#include<>,一种是#include“” , 第一种是在标准库中查找头文件,第二种是先在我们工程中寻找是否有该文件,如果没有,就去标准库中查找。
注意:我们不提倡多次包含头文件,因为在预处理的讲解中已经提到,预处理阶段会将头文件的代码搬进我们的文件中去,如果多次包含头文件,会让我们的文件凭空多上几百行代码,这是没必要的。
那么如何避免这种多次包含的问题呢?一种好的方法就是用上我们刚刚提到的条件编译指令。
在我们的头文件中写上这么一段代码,
#ifndef __TEST_H__
#define __TEST_H__
//这之间是头文件中函数的声明
//当我们第一次去包含这个文件的时候,#ifndef执行,就会定义_TESE_H__
//当我们第二次去包含这个文件的时候,因为_TESE_H__已经被定义过了,
//所以#ifndef的判断为假,下面的语句不会执行,也就不包含这个文件了。
//这样就做到了防止重复包含
#endif
本章完