#if 和 #ifdef的区别

面试题

  • 猜一下哪段代码会被编译进去,强调下是编译进去,不是执行
  #define XXX 0

  // 第一段条件编译
  #ifdef XXX
    逻辑1
  #else
    逻辑2
  #endif

  // 第二段条件编译
  #if XXX
    逻辑1
  #else
    逻辑2
  #endif
  • 答案
    • 第一段条件编译:逻辑1会被编译进去
    • 第二段条件编译:逻辑2会被编译进去

总结

  • #if既关心宏是否定义,又关心宏的逻辑的真假
  • #ifdef(#if defined())、#ifndef(#if !defined())仅仅关心宏是否被定义,不关心宏的逻辑真假

#ifdef

  • 代码示例
  #ifdef
      逻辑1
  #else
      逻辑2
  #endif
  • #ifdef只关心是否被定义不关心逻辑的真假
  • 举例:#define 宏 1#define 宏 0 等效,都等同于 #define 宏

#if

  • 代码示例
  #if
      逻辑1
  #else
      逻辑2
  #endif
  • #if不仅关心是否被定义而且关心逻辑的真假

常见预编译指令总结

  • #if、#elif、#else、#endif使用示例
#if 条件1
 代码段1
#elif 条件2
 代码段2
.
.
.
#elif 条件n
 代码段n
#else
 代码段 n+1
#endif
  • #ifdef、#ifndef、#else、#endif使用示例
    // 如果定义了macro_name宏就编译代码段1
    #ifdef macro_name   
        代码段1
    #else   
        代码段2
    #endif
    
    // 等价于上面的条件编译指令,如果未定义macro_name宏,就编译代码段1
    #ifndef macro_name
        代码段2
    #else
        代码段1
    #endif
    
  • #if defined()#ifdef 的比较
    #ifdef MACRO_1
      #ifdef MACRO_2
          代码段A
      #endif
    #endif
    
    // 等价于上面的条件编译指令
    #if defined(MACRO_1) && defined(MACRO_2)
        代码段A
    #endif
    
  • #if !defined()#ifndef 的使用同上

强调两点

  • 这几个宏定义只是决定代码块是否被编译
  • 别忘了#endif

参考链接

作者:yanhooIT
链接:https://www.jianshu.com/p/609ff54ec6a5
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值