美文网首页iOS开发(OC)
#if 和 #ifdef的区别

#if 和 #ifdef的区别

作者: yanhooIT | 来源:发表于2016-09-28 12:12 被阅读1217次

面试题

  • 猜一下哪段代码会被编译进去,强调下是编译进去,不是执行
  #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

参考链接

相关文章

网友评论

  • 829892bd04cf:写错了吧。第一个答案应该两个都是 逻辑1 吧。下面说了 #if 里面 xxx 定义了,且值是1.应该是真,所以是逻辑1被编译吧。
    yanhooIT:@829892bd04cf 谢谢提醒,当时写错了,谢谢提醒

本文标题:#if 和 #ifdef的区别

本文链接:https://www.haomeiwen.com/subject/rhbhyttx.html