預處理還需要運算子?有沒有搞錯?
^_^, 沒有搞錯,預處理是有運算子,而且還不止乙個:
#(單井號) —— 字串化運算子。
##(雙井號 )—— 連線運算子
#@—— 字元化運算子。
接下來我們會分別說明一下他們的用法.
1.字串化運算子 ——#
用於建立字串,#運算子後面應該跟乙個形參(中間可以有空格或tab),例如:
[cpp]view plain
copy
print?
#define str(s) #s
puts(str(here is a demo)); // 相當於puts("here is a demo");
常用例項:
我們在除錯**的時候有時需要列印一些字串的值,如下:
[c-sharp]view plaincopy
?
#include
#define dump_str(s) printf("%s = %s/n",#s,s);
int main()
用於將兩個token連線成乙個token; 這裡提到乙個需要概念token ,先說明一下:
什麼是token?
人與人之間的溝通,通過說話,而每句話便是由單詞組合在一起,形成特定的語義。這裡的單詞便可理解成 token。
c語言編譯器相當於乙個翻譯,要懂兩種語言——c語言和機器語言;它的工作是將c語言翻譯成機器語言。首先它應該讀懂c語言中的「句子」,而對整個「句子」的理解,是建立在對每個「單詞」理解的基礎上的,所以首先我們要把句子分成多個單詞——分詞。
詞法分析便是將c語言的「句子」按照詞法規則拆分成 token 序列。
例如:[c-sharp]view plain
copy
print?
#define __concat(x,y) x ## y
int n1 =15;
int n2 =200;
__concat(n,1); // n1
__concat(n,2); // n2
常見用法:glib庫中stdint.h (sysdeps/generic):150:#define __int64_c(c) c ## l stdint.h (sysdeps/generic):151:#define __uint64_c(c) c ## ul
將某個常量後自動加上 l或ul,達到資料型別強制轉換的目的。用於建立乙個字元,類似 ## ,注: 非 ansi-c中的特性,gcc不支援,vc可以; 使用例項如下:
[cpp]view plaincopy
?
#include
#define dump_char(c) #@c
int main()
預處理運算子
預處理器運算子作用在預處理階段,在 define中處理字元時使用。1 字串化運算子 對於需要轉義的字元如 或者 巨集處理運算子會自動插入到字元前 對於用空格隔開的字串,巨集處理過程會自動拼接各個字元 define fb x x bc fb a 結果為字串abc fb a 結果為字串 a bc 2 字...
C語言預處理運算子
預處理還需要運算子?有沒有搞錯?沒有搞錯,預處理是有運算子,而且還不止乙個 單井號 字串化運算子。雙井號 連線運算子 字元化運算子。接下來我們會分別說明一下他們的用法.1.字串化運算子 用於建立字串,運算子後面應該跟乙個形參 中間可以有空格或tab 例如 define str s s puts st...
C語言預處理中的 和 運算子
3.運算子 出現在巨集定義中的 運算子把跟在其後的引數轉換成乙個字串。有時把這種用法的 稱為字串化運算子。例如 definepaste n adhfkj n main 巨集定義中的 運算子告訴預處理程式,把源 中任何傳遞給該巨集的引數轉換成乙個字串。所以輸出應該是adhfkj15。4.運算子 運算子...