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

C語言預處理器詳解(三):文件包含與條件編譯

     編輯:C 語言基礎

文件包含 #include

將指定文件內容原樣插入到 #include 所在行,形成單一編譯單元。實現模塊化、聲明複用、配置隔離。

兩種搜尋路徑模式

語法搜尋順序典型用途
#include <stdio.h>系統包含目錄(-I 指定、環境變量、編譯器內建)標準庫、系統頭文件、第三方庫
#include "myheader.h"1. 當前源文件目錄 2. 系統包含目錄項目內部頭文件、本地配置

規則與特性

  • 一條 #include 只能包含一個文件,多文件需多條指令。
  • 允許嵌套包含:A 包含 B,B 包含 C。需防止重複包含(見護衛宏)。
  • 包含路徑可用相對路徑:#include "../common/config.h"。

防重複包含:護衛宏

// myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H

// 聲明內容
void foo(void);

#endif

或現代 #pragma once(非標準但主流編譯器均支持)。

條件編譯

根據編譯期條件選擇性編譯代碼片段,生成不同目標文件。用於:跨平台適配、功能裁剪、調試開關、版本區分。

三種形式

1. #ifdef / #else / #endif


#ifdef MACRO_NAME
    // MACRO_NAME 已定義(無論值)編譯此段
#else
    // 未定義編譯此段
#endif

// 無 else 簡寫
#ifdef DEBUG
    printf("Debug: %d\n", x);
#endif

2. #ifndef / #else / #endif


#ifndef MACRO_NAME
    // 未定義編譯此段
#else
    // 已定義編譯此段
#endif

常用於護衛宏:#ifndef HEADER_H。

3. #if / #elif / #else / #endif(常量表達式)


#define VERSION 2

#if VERSION == 1
    void func_v1(void);
#elif VERSION == 2
    void func_v2(void);
#else
    #error "Unsupported version"
#endif
  • 表達式必須是整型常量表達式(可含 defined(MACRO) 運算符)。
  • defined(MACRO) 返回 1/0,可用於複雜條件:#if defined(OS_LINUX) && defined(ARCH_X86_64)。

條件編譯 vs 運行時 if

維度條件編譯運行時 if
決策時機編譯期運行期
目標代碼僅包含選中分支包含所有分支
體積更小較大
靈活性需重新編譯切換運行時動態切換
適用場景平台差異、功能裁剪、調試代碼業務邏輯分支

實戰案例:跨平台休眠


// platform.h
#ifdef _WIN32
    #include 
    #define SLEEP_MS(ms) Sleep(ms)
#elif defined(__linux__) || defined(__APPLE__)
    #include 
    #define SLEEP_MS(ms) usleep((ms)*1000)
#else
    #error "Unsupported platform"
#endif

// 使用
SLEEP_MS(1000);  // 編譯期展開為平台特定調用

預處理器運算符

  • # 字符串化:#define STR(x) #x → STR(abc) 展開 "abc"。
  • ## 連接:#define CONCAT(a,b) a##b → CONCAT(var,1) 展開 var1。
  • #@ 字符化(GNU 擴展):#define CHAR(c) #@c → CHAR(a) 展開 'a'。

總結

  • #include 實現聲明共享與模塊化,善用雙引號/尖括號區分路徑,務必加護衛宏。
  • 條件編譯三大形式:#ifdef、#ifndef、#if,核心是編譯期決策、死代碼消除。
  • 預處理運算符 # ## 能構建強大的元編程模板(如自動生成枚舉字符串、註冊表)。
  • 合理使用預處理功能,讓代碼可讀、可配、可移植、可調試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved