有三種運算子只能用在預處理指令中,它們是字串化運算子#,貼上運算子##和字元化運算子#@。
字串化運算子#
在巨集引數的前面放乙個#會使編譯器在展開巨集時插入引數的名字而不是它的值。其主要效果是把引數的名字轉換為字串。下面的範例演示了字串化運算子的語法:
#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...