首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C/C++ 條件編譯完整指南:#ifdef、#ifndef、#if 實戰技巧與頭檔防重複包含

     編輯:關於C語言

條件編譯基本語法

1. #ifdef / #else / #endif

#ifdef IDENTIFIER
    // 程式段 1:識別符已定義時編譯
#else
    // 程式段 2:識別符未定義時編譯
#endif

2. #ifndef / #else / #endif

#ifndef IDENTIFIER
    // 程式段 1:識別符未定義時編譯
#else
    // 程式段 2:識別符已定義時編譯
#endif

與 #ifdef 作用相反。

3. #if 運算式 / #else / #endif

#if EXPRESSION
    // 運算式為真(非零)編譯程式段 1
#else
    // 運算式為假(零)編譯程式段 2
#endif

實戰應用場景

跨平台型別定義

#ifdef WINDOWS
    #define MYTYPE long
#else
    #define MYTYPE float
#endif

// Windows 專案編譯前加:#define WINDOWS

除錯開關控制

#ifdef DEBUG
    printf("device_open(%p)\n", file);
#endif

// 除錯時定義 DEBUG,釋出版移除即可統一關閉所有除錯輸出

編譯期常數分支

#define LETTER 1  // 1=大寫輸出, 0=小寫輸出

while ((c = str[i++]) != '\0') {
    #if LETTER
        if (c >= 'a' && c <= 'z') c -= 32;
    #else
        if (c >= 'A' && c <= 'Z') c += 32;
    #endif
    putchar(c);
}

優點:編譯期決定分支,目標碼更小、無執行期判斷開銷。

頭檔防重複包含:標準護衛模式

#ifndef _HEADER_NAME_H_
#define _HEADER_NAME_H_

// 頭檔內容:宣告、定義、內聯函式等

#endif

命名慣例

  • 全大寫、前後加底線
  • 將點號替換為底線
  • 範例:stdio.h → _STDIO_H_

為什麼必要?

多個 .c 檔包含同一頭檔,連結時會導致重複定義錯誤。護衛模式確保頭檔內容每個編譯單元只被處理一次。

進階技巧

#define 與條件編譯結合

#define VERSION 2

#if VERSION == 1
    // 版本 1 程式碼
#elif VERSION == 2
    // 版本 2 程式碼
#else
    // 預設版本
#endif

編譯器預定義巨集

  • __FILE__、__LINE__、__DATE__、__TIME__
  • __STDC__、__cplusplus (C++ 模式)
  • 平台相關:_WIN32、__linux__、__APPLE__

最佳實務總結

場景推薦寫法關鍵點
頭檔防重複#ifndef _GUARD_H_ / #define _GUARD_H_ / #endif命名唯一、放最外層
平台差異#ifdef _WIN32 / #else / #endif用編譯器預定義巨集
除錯輸出#ifdef DEBUG / ... / #endif單一定義控制全域
版本控制#if VERSION == N / #elif / #else / #endif集中管理版本常數
功能裁剪#ifdef FEATURE_X / #endif編譯期移除未用程式碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved