当前位置: 代码迷 >> 综合 >> 预编译命令之#define、#if、#ifdef、#ifndef、#undef
  详细解决方案

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

热度:25   发布时间:2024-01-12 16:31:20.0

文章目录

  • 一、#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之间的区别

  相关解决方案