在巨集定義中,# 運算子可將巨集參數轉換為字串常值。它只能用於巨集定義內部,不能直接用於普通語句。
例如:
#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 的返回值(列印字元數),而非字串本身。# 僅能用於巨集參數前,不可用於變數或運算式。