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

C語言預處理器完整指南:指令、宏、運算符與預定義宏

     編輯:關於C語言

C語言預處理器完整指南:指令、宏、運算符與預定義宏

預處理器(CPP)是編譯前獨立階段,進行純文本替換。掌握其指令、宏定義技巧與預定義宏,能極大提升代碼可移植性、可配置性與調試效率。

核心預處理指令

指令功能示例
#define定義宏(對象/函數式)#define PI 3.14159
#include包含文件#include <stdio.h>
#undef取消宏定義#undef PI
#ifdef若宏已定義則編譯#ifdef DEBUG
#ifndef若宏未定義則編譯#ifndef HEADER_H
#if / #elif / #else / #endif條件編譯#if VERSION > 2
#error輸出錯誤並停止編譯#error "Unsupported platform"
#pragma編譯器特定指令#pragma pack(1)
#line修改行號/文件名#line 100 "gen.c"

ANSI C 標準預定義宏

宏含義示例值
__DATE__編譯日期"Jan 15 2025"
__TIME__編譯時間"14:30:00"
__FILE__當前文件名"main.c"
__LINE__當前行號42
__STDC__ANSI C 合規標識1
__STDC_VERSION__C 標準版本199901L (C99)
__STDC_HOSTED__宿主/自由實現1/0

**調試神技**:printf("DEBUG: %s:%d\n", __FILE__, __LINE__); 瞬間定位日誌來源。

預處理器運算符

  1. 續行符 \:宏定義跨行
    #define MULTI_LINE \
        do { \
            foo(); \
            bar(); \
        } while(0)
  2. 字符串化 #:將參數轉為字符串字面量
    #define STR(x) #x
    STR(hello)  →  "hello"
  3. 標記粘連 ##:合併兩個標記
    #define CONCAT(a, b) a##b
    CONCAT(var, 1)  →  var1
  4. defined():條件編譯中判斷宏是否定義
    #if defined(DEBUG) && defined(LINUX)

參數化宏模擬函數

#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define SAFE_FREE(p) do { free(p); (p) = NULL; } while(0)

關鍵規範:

  • 宏名與 ( **無空格**;
  • 參數、整個表達式**雙層括號**包裹,防止優先級錯誤;
  • 多語句宏用 do { ... } while(0) 包裹,保證分號語法正確;
  • **避免參數副作用**:MAX(i++, j) 導致 i 自增兩次。

進階技巧

1. 可變參數宏 (C99 __VA_ARGS__)

#define LOG(fmt, ...) printf("[%s:%d] " fmt "\n", __FILE__, __LINE__, __VA_ARGS__)
LOG("value = %d", x);

2. 宏遞歸生成代碼(配合 ##)

#define DECL(n) int var##n;
DECL(1) DECL(2)  →  int var1; int var2;

3. 防重複包含護衛

#ifndef MY_HEADER_H
#define MY_HEADER_H
// ...
#endif

總結

預處理器雖是「文本替換」,但善用條件編譯、字符串化、標記粘連與預定義宏,能實現**跨平台適配、編譯期計算、自動化日誌、代碼生成**等高級能力。切記:宏無類型、無作用域、無副作用保護,**能用 const/inline/constexpr 替代時優先替代**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved