#ifndef #ifdef endif等预编译用法

   今天来写一下一个程序开发中的小技巧,我们平时在编写程序的时候,一般来说是很难一次性成功的,都会经历很多次的调试,而且在很多时候整体的代码量偏大、模块居多,需要单个进行调试,这时候如果一个一个·进行注释就会显得很麻烦,所以我们在这里使用预编译指令。

   对于预编译指令大家一定都不会陌生,我们编写一个.h文件时会用到#ifndef、#define、#endif这几句,很多人可能刚开始不明白为什么要使用这几句,现在我就来讲一下我自己的一份理解。

   首先是#ifndef、#ifdef与#endif,对于#ifndef、#ifdef这两条指令可以将它看成一个判断,#ifndef完整书写是if not define,表明如果在这之前没有定义这一变量,那么就会执行对应的内容,而#ifdef效果正好相反,直到执行完#endif跳出编译,我们就可以通过这种指令快速的打开与关闭所有同一模块的程序,不用再逐一注释。

    #define 用法用于定义预处理器宏,#define配合上述的指令才能正常使用上述指令,同时#define还有一个作用,他可以实现赋值处理例如#define PI 3.14就是将3.14作为PI这一参数的值,#else 用于在#if和#elif预处理器指令的条件不满足时执行代码块。

 #if, #elif, #else, #endif使用示例
#if 条件 1
 代码段 1
#elif 条件 2
   代码段 2
...
#elif 条件 n
 代码段 n
#else
 代码段 n+1
#endif
即可以设置不同的条件,在编译时编译不同的代码,预编译指令中的表达式与C语言本身的表达式基本一至如逻辑运算、算术运算、位运算等均可以在预编译指令中使用。之所以能够实现条件编译是因为预编译指令是在编译之前进行处理的,通过预编译进行宏替换、条件选择代码段,然后生成最后的待编译代码,最后进行编译。
#if 的一般含义是如果#if 后面的常量表达式为true,则编译它所控制的代码,如条件1成立时就代码段1,条件1不成立再看条件2是否成立,如果条件2成立则编译代码段2,否则再依次类推判断其它条件,如果条件1-N都不成力则会编译最后的代码段n+1。
通过宏函数defined(macro_name)
参数为宏名(无需加""),如果该macro_name定义过则返回真,否则返回假,用该函数则可以写比较复杂的条件编译指令如
#if defined(macro1) || (!defined(macro2) && defined(macro3))...#else...#endif

    条件编译技巧与上述示例#ifdef和#defined()比较  首先比较一下这两种方法,第一种方法只能判断一个宏,如果条件比较复杂实现起来比较烦锁,用后者就比较方便。如有两个宏MACRO_1,MACRO_2只有两个宏都定义过才会编译代码段A,分别实现如下:#ifdef MACRO_1#ifdef MACRO_2代码段 A#endif#endif
或者
#if defined(MACRO_1) && defined(MACRO_2)
#endif
同样,要实现更复杂的条件用#ifdef更麻烦,所以推荐使用后者,因为即使当前代码用的是简单的条件编译,以后在维护、升级时可能会增加,用后者可维护性较强。旧的编译器可能没有实现#defined()指令,C99已经加为标准。要兼容老的编译器,还需用#ifdef指令。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值