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

C語言預處理器 # 與 ## 運算符詳解

     編輯:關於C語言

# 運算符:字串化

將宏參數轉換為字串常值。參數名稱前加 #,展開時會被雙引號包圍。

範例 1:除錯巨集

#define P(A) printf("%s:%d\n", #A, A)

int a = 1, b = 2;
P(a);      // 輸出: a:1
P(b);      // 輸出: b:2
P(a+b);    // 輸出: a+b:3

範例 2:在字串中嵌入參數

#define SQR(x) printf("The square of " #x " is %d.\n", (x)*(x))

SQR(8);    // 輸出: The square of 8 is 64.

關鍵點:"The square of " #x " is %d.\n" 中相鄰字串常值會自動連接。

## 運算符:標記連接

將兩個標記 (token) 連接成單一標記。常用於建構識別符名稱。

基本用法

#define XNAME(n) x ## n

XNAME(8)   // 展開為: x8
XNAME(var) // 展開為: xvar

進階應用:API 封裝

#define CASE(x,y) case x: _bsd_setlasterror(anApplInstance, BSD_ ## y); break

CASE(1, EINVAL)  // 展開: case 1: _bsd_setlasterror(..., BSD_EINVAL); break

## 限制規則

  • 連接結果必須是合法的 C 標記 (識別符、關鍵字、常值等)
  • 不能任意連接:+ ## + → ++ 合法;1 ## 2 → 12 合法;x ## + 非法
  • 單一宏定義中可多次使用 ##

組合使用範例

#define DECLARE_FUNC(name) void name##_init(void); void name##_cleanup(void)

DECLARE_FUNC(foo)
// 展開: void foo_init(void); void foo_cleanup(void);

實務建議

  • # 適合除錯輸出、日誌、錯誤訊息自動化
  • ## 適合程式碼生成、API 封裝、避免重複命名
  • 過度使用會降低可讀性,建議配合 #pragma message 或編譯器 -E 查看展開結果
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved