#if 和 #ifdef的區(qū)別

面試題

  • 猜一下哪段代碼會被編譯進去,強調下是編譯進去,不是執(zhí)行
  #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

參考鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容