文章目录
- 一、#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);//10return 0;
}
二、,#udef 宏
取消以前定义的宏定义 ; 如果以前没定义,则忽略它。
/*取消宏定义*/
#include<stdio.h>
#define M 10
#undef M
int main()
{
printf("%d\n",M);//error,未定义标识符Mreturn 0;
}
/*忽略*/
#include<stdio.h>
#undef M
int main()
{
printf("neglect\n");//成功输出neglectreturn 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 100int 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 100int main()
{
printf("M:%d,N:%d\n",M,N);//M:0,N:100return 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 100int main()
{
printf("M:%d,N:%d\n",M,N);//M:0,N:100return 0;
}
/*执行程序段2和3*/
#include<stdio.h>#define K 10#if K==0
#define M 0#else
#define M 10#endif
#define N 100int main()
{
printf("M:%d,N:%d\n",M,N);//M:10,N:100return 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 100int 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 100int main()
{
printf("M:%d,N:%d\n",M,N);//M:10,N:100return 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之间的区别