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

C 語言編譯預處理詳解:宏定義、文件包含與條件編譯

     編輯:關於C語言

C 語言編譯預處理詳解:宏定義、文件包含與條件編譯

C 語言中以 `#` 開頭的行稱為編譯預處理命令。主要命令:`#define`, `#undef`, `#include`, `#if`, `#else`, `#elif`, `#endif`, `#ifdef`, `#ifndef`, `#line`, `#pragma`, `#error`。預處理在編譯前執行,進行文本替換、文件包含、條件編譯等。

1. 宏替換

1.1 不帶參數的宏定義

#define 宏名 替換文本
  • 宏名、替換文本間用空格分隔。例:`#define SIZE 100`
  • 替換文本可包含已定義宏:`#define PI 3.14` → `#define ADDPI (PI + 1)`
  • 換行續寫:行尾加 `\`,注意 `\` 後不可有空格。
  • 同一宏名不可重複定義(除非完全相同)。
  • 不替換雙引號內字符串、標識符內部片段。
  • 習慣宏名全大寫,定義置於文件開頭。

1.2 帶參數的宏定義

#define 宏名(形參表) 替換文本
  • 宏名與 `(` 緊貼,不可有空格。例:`#define MUL(x, y) ((x) * (y))`
  • 形參在替換文本中應加括號,整個表達式也加括號,防止優先級錯誤。
  • 調用時實參個數必須匹配,預處理階段直接文本替換,無類型檢查,不佔用運行時間(優於函數調用)。

1.3 終止宏定義

#undef 宏名

使宏定義在該行後失效。作用域從 `#define` 到 `#undef` 或文件結尾。

2. 文件包含

#include "文件名"   // 先在源文件目錄查找,再按系統路徑
#include <文件名>   // 直接按系統標準路徑查找
  • 通常置於文件開頭,稱「頭文件」,後綴常用 `.h`。
  • 頭文件常含公共宏定義、外部聲明、函數原型(如 `stdio.h`)。
  • 頭文件修改後,包含它的源文件需重新編譯鏈接。
  • 允許任意多個 `#include`。

3. 條件編譯

#if 常量表達式
#elif 常量表達式
#else
#endif

#ifdef 宏名   // 等價 #if defined(宏名)
#ifndef 宏名  // 等價 #if !defined(宏名)

常用於:跨平台代碼隔離、防止頭文件重複包含(`#ifndef HEADER_H #define HEADER_H ... #endif`)、調試開關。

4. 例題:判斷字符是否為字母

#include <stdio.h>
// 宏定義判斷輸入字符是否為字母
#define MYALPHA(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z') ? 1 : 0)

int main() {
    char ch;
    printf("Please enter a character 'c'.\n");
    printf("Enter 'f' or 'F' to finish.\n");
    // scanf("%c%*c", &ch) 讀取字符並跳過換行符
    while (scanf("%c%*c", &ch) == 1 && ch != 'f' && ch != 'F') {
        printf("The ASCII code of character is: %d\n", ch);
        if (MYALPHA(ch))
            printf("c is a character.\n");
        else
            printf("c is not a character.\n");
    }
    return 0;
}
#undef MYALPHA // 終止宏作用域

5. 預定義宏

編譯器內建宏:`__FILE__`(當前文件名)、`__LINE__`(當前行號)、`__DATE__`(編譯日期)、`__TIME__`(編譯時間)、`__STDC__`(標準 C 標識)。常用於調試日志。

6. 宏與 const 差別

  • 宏是文本替換,無類型檢查,不佔內存,不可調試。
  • `const` 有類型、作用域、可調試,本質是只讀變量(某些情況下可被修改)。
  • 現代 C++ 推薦用 `constexpr`/`const` 替代宏定義常量。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved