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

C/C++ 宏定義中 # 號運算子的字串化用法詳解

     編輯:關於C

# 運算子(Stringizing Operator)

在巨集定義中,# 運算子可將巨集參數轉換為字串常值。它只能用於巨集定義內部,不能直接用於普通語句。

例如:

#define TRACE(S) (printf("%s\n", #S), S)

當呼叫 TRACE(a) 時,#S 會被替換為 "a",展開後等同於:

(printf("%s\n", "a"), a)

完整範例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRACE(S) (printf("%s\n", #S), S)

int main() {
    int a = 5;
    int b = TRACE(a);              // 輸出 "a",b = 5
    const char *str = "hello";
    char des[50];
    strcpy(des, TRACE(str));       // 輸出 "str",des = "hello"
    puts(des);
    system("pause");
    return 0;
}

關鍵點解析

  • 逗號運算式:TRACE 定義為逗號運算式 (expr1, expr2),整個運算式的值為第二個運算元 S 的值,因此 strcpy(des, TRACE(str)) 實際拷貝的是 str 的內容。
  • 返回值:若寫成 int a = printf("%s\n", "S"),a 會得到 printf 的返回值(列印字元數),而非字串本身。
  • 適用場景:除錯追蹤、日誌輸出、自動生成字串常值等。

注意事項

  1. # 僅能用於巨集參數前,不可用於變數或運算式。
  2. 若參數本身包含巨集,會先展開參數再字串化;若需字串化參數名稱本身,需雙層巨集。
  3. 字串化後會自動處理轉義字元與引號。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved