预编译命令之#define、#if、#ifdef、#ifndef、#undef


以#开头的都是预编译指令,就是在正式编译之前,编译器做一些预处理的工作.


一、#define 宏

1.定义一个常量值

#define M 10

如:

#include<stdio.h>
#define M 10
int main()
{
	printf("%d\n",M);
	//10
	return 0;
}

二、,#udef 宏

取消以前定义的宏定义 ; 如果以前没定义,则忽略它。

/*取消宏定义*/
#include<stdio.h>
#define M 10
#undef M
int main()
{
	printf("%d\n",M);
	//error,未定义标识符M
	return 0;
}
/*忽略*/
#include<stdio.h>
#undef M
int main()
{
	printf("neglect\n");
	//成功输出neglect
	return 0;
}

三、#if 条件

1.#if #endif

#if 条件语句
程序段1			//如果条件语句成立,那么就编译程序段1 
#endif
程序段2			//不管程序段1编译与否,都编译程序段2
/*执行程序段2*/
#include<stdio.h>

#define K 10

#if K==0
#define M 0

#endif
#define N 100

int main()
{
	printf("N:%d\n",N);
	//输出N:100
	//!printf("M:%d\n",M);
	//M未定义
	return 0;
}
/*执行程序段1和2*/
#include<stdio.h>

#define K 0

#if K==0
#define M 0

#endif
#define N 100

int main()
{
	printf("M:%d,N:%d\n",M,N);
	//M:0,N:100
	return 0;
}

2.#if #else #endif

#if 条件语句
程序段1			//如果条件语句成立,那么就编译程序段1
#else
程序段2			//如果条件不语句成立,那么就编译程序段2
#endif
程序段3			//不管程序段1和2执行哪个,执行完后都会执行这个
/*执行程序段1和3*/
#include<stdio.h>

#define K 0

#if K==0
#define M 0

#else
#define M 10

#endif
#define N 100

int main()
{
	printf("M:%d,N:%d\n",M,N);
	//M:0,N:100
	return 0;
}
/*执行程序段2和3*/
#include<stdio.h>

#define K 10

#if K==0
#define M 0

#else
#define M 10

#endif
#define N 100

int main()
{
	printf("M:%d,N:%d\n",M,N);
	//M:10,N:100
	return 0;
}

四、#ifdef 宏

1.#ifdef #endif

#ifdef x		//如果x被宏定义过,那么就编译程序段1 
程序段1			
#endif			//不管x被宏定义与否,都编译程序段2
程序段2

同【三、】

/*执行程序段1和3*/
#include<stdio.h>

#ifdef K
#define M 10

#endif
#define N 100

int main()
{
	printf("N:%d\n",N);
	//输出N:100
	//!printf("M:%d\n",M);
	//M未定义
	return 0;
}
/*执行程序段1和2*/
#include<stdio.h>

#define K 10

#ifdef K
#define M 10

#endif 
#define N 100

int main()
{
	printf("M:%d,N:%d\n",M,N);
	//M:10,N:100
	return 0;
}

2.#ifef #else #endif

#ifdef x		//如果x被宏定义过,那么就编译程序段1 
程序段1			
#else			//如果x未被宏定义过,那么就编译程序段2
程序段2
#endif			//不管x被宏定义与否,都编译程序段3
程序段3

同【三、】

五、#ifndef 宏

1.#ifndef #endif

#ifndef x		//如果x未被宏定义过,那么就编译程序段1 
程序段1			
#endif			//不管x被宏定义与否,都编译程序段2
程序段2

2.#ifndef #else #endif

#ifndef x		//如果x未被宏定义过,那么就编译程序段1 
程序段1			
#else			//如果x被宏定义过,那么就编译程序段2
程序段2
#endif			//不管x被宏定义与否,都编译程序段3
程序段3

六、防重复编译作用

显然int a;在同一区间内不能重复定义两次,同理,为了防止头文件被重复编译两次,我们使用预编译命令来完成这件事。

#ifndef 随便起得标识符XXX
#define 随便起得标识符XXX
代码段
#endif

这样当第一次编译的时候,检查到没有随便起得标识符XXX存在,开始第一次编译。当第二次重复编译的时候,检查到随便起得标识符XXX已经存在,不重复编译代码段。


Reference:
#define #undef #ifdef #ifndef #if用法
预编译命令之 if、#if、#ifdef、#ifnde、#undef之间的区别

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值