C C 幾個有用的預處理運算子

2021-04-15 12:09:22 字數 1184 閱讀 6049

有三種運算子只能用在預處理指令中,它們是字串化運算子#,貼上運算子##和字元化運算子#@。

字串化運算子#

在巨集引數的前面放乙個#會使編譯器在展開巨集時插入引數的名字而不是它的值。其主要效果是把引數的名字轉換為字串。下面的範例演示了字串化運算子的語法:

#define stringlize(ivalue) printf(#ivalue " is: %d", ivalue)

......

...int ivalue = 2;

stringlize(ivalue);

這個巨集的輸出如下:

ivalue is: 2

貼上運算子##

當需要動態生成變數名或巨集名的時候,貼上運算子就很有用了。這個運算子刪除它左右兩邊的空白字元,然後把左右兩邊剩餘的字串連線在一起,構成乙個新的字串。特別地,它並不是簡單地把左右兩邊的字串常量做直接連線,而是把引數替換後再連線。也即它先進行巨集替換,再進行連線:

#define ivalue_names(icurrent_number) ivalue ## icurrent_number

......

...int ivalue_names(1);

編譯器把上面的**看作下面的宣告:

int ivalue1;

注意:預處理程式刪去了空白字元,因為編譯器不會把ivalue1看作是ivalue 1。這個運算子可以與其它預處理指令組合使用,構成複雜的定義。下面的範例使用了貼上運算子來生成乙個巨集名,這會使預處理程式呼叫適當的巨集:

#define macro1 printf("macro1 is invoked.")

#define macro2 printf("macro2 is invoked.")

#define make_macro(n) macro ## n

......

...make_macro(2);

這個範例的輸出將是:

macro2 is invoked.

字元化運算子#@

在巨集定義中,字元化運算子放在一般的引數之前。這會使實際的引數被當作乙個用單引號括起的字元。例如:

#define charizeit(cvalue)  #@cvalue

......

...clatter = charizeit(z);

編譯器把上面的**看作是:

clatter = 'z'; 

預處理運算子

預處理器運算子作用在預處理階段,在 define中處理字元時使用。1 字串化運算子 對於需要轉義的字元如 或者 巨集處理運算子會自動插入到字元前 對於用空格隔開的字串,巨集處理過程會自動拼接各個字元 define fb x x bc fb a 結果為字串abc fb a 結果為字串 a bc 2 字...

C預處理運算子

預處理還需要運算子?有沒有搞錯?沒有搞錯,預處理是有運算子,而且還不止乙個 單井號 字串化運算子。雙井號 連線運算子 字元化運算子。接下來我們會分別說明一下他們的用法.1.字串化運算子 用於建立字串,運算子後面應該跟乙個形參 中間可以有空格或tab 例如 cpp view plain copy pr...

C語言預處理運算子

預處理還需要運算子?有沒有搞錯?沒有搞錯,預處理是有運算子,而且還不止乙個 單井號 字串化運算子。雙井號 連線運算子 字元化運算子。接下來我們會分別說明一下他們的用法.1.字串化運算子 用於建立字串,運算子後面應該跟乙個形參 中間可以有空格或tab 例如 define str s s puts st...