在類函式巨集中(帶引數的巨集),#號作為乙個預處理運算子,可以把記號轉換成字串。
下面是乙個類函式巨集:
#define psqr(x) printf("the square of x is %d. \n",((x)*(x))
假設這樣使用巨集:
psqr(8
);
輸出為
the square of x is 64.
注意雙引號字串中x被視為普通文字,而不是乙個可被替換的記號。
c語言允許在字串中包含巨集引數。在類函式巨集中(帶引數的巨集),#號作為乙個預處理運算子,可以把記號轉換成字串。例如,如果x是乙個巨集形參,那麼#x
就是轉換為字串「x」的形參名。這個過程稱為字串化。
示例:
/* subst.c -- substitute in string */
#include
#define psqr(x) printf("the square of " #x " is %d.\n",((x)*(x)))
intmain
(void
)
該程式的輸出如下:
the square of y is 25.
the square of 2 + 4 is 36.
呼叫第乙個巨集時,用「y」替換#x
,呼叫第二個巨集時,用"2 + 4"替換#x
。ansi c字串的串聯特性將這些字串與printf()語句的其他字串組合,生成最終的字串。例如,第一次呼叫變成:
printf
("the square of "
"y"" is %d.\n",(
(y)*
(y))
);
然後,字串串聯功能將這三個字串組合成乙個字串:
"the square of y is %d.\n"
注意,#的這種作用只有在類函式巨集的替換體中才能發揮這種作用。 C語言 運算子與 運算子
我們平時使用帶參巨集時,字串中的巨集引數是沒有被替換的。例如 輸出結果為 然而,我們期望輸出的結果是 5 20 2513 14 27 這該怎麼做呢?其實,c語言允許在字串中包含巨集引數。在類函式巨集 帶參巨集 中,號作為乙個預處理運算子,可以把記號轉換成字串。例如,如果a是乙個巨集形參,那麼 a就是...
C語言 運算子和 運算子
變數 代表 取變數的位址 變數 代表 指標型的變數 取址運算子 用來取得其運算元的位址。如果運算元 x 的型別為 t,則表示式 x 的型別是 t 型別指標 指向 t 的指標 取址運算子的運算元必須是在記憶體中可定址到的位址。換句話說,該運算子只能用於函式或物件 例如左值 而不可以用於位欄位,以及那些...
C語言運算子
1級優先順序左結合 圓括號 下標運算子 指向結構體成員運算子 結構體成員運算子 字尾增量運算子 字尾增量運算子 2級優先順序右結合 邏輯非運算子 按位取反運算子 字首增量運算子 字首增量運算子 負號運算子 型別 型別轉換運算子 指標運算子 位址與運算子 sizeof 長度運算子 3級優先順序左結合 ...