预处理(条件编译)

一、 #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 

本章完

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值