C預處理運算子

2021-06-25 09:38:33 字數 1722 閱讀 7953

預處理還需要運算子?有沒有搞錯?

^_^, 沒有搞錯,預處理是有運算子,而且還不止乙個:

#(單井號)    —— 字串化運算子。

##(雙井號 )—— 連線運算子

#@—— 字元化運算子。

接下來我們會分別說明一下他們的用法.

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 plain

copy

print

?

#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 plain

copy

print

?

#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.運算子 運算子...