文章目录

  • 一、#define 宏
  • 1.定义一个常量值
  • 二、,#udef 宏
  • 三、#if 条件
  • 1.#if #endif
  • 2.#if #else #endif
  • 四、#ifdef 宏
  • 1.#ifdef #endif
  • 2.#ifef #else #endif
  • 五、#ifndef 宏
  • 1.#ifndef #endif
  • 2.#ifndef #else #endif
  • 六、防重复编译作用



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


一、#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已经存在,不重复编译代码段。