巨集定義中 號的作用

2021-07-04 21:52:33 字數 1141 閱讀 3531

1.#的作用是,對這個變數替換後,再加雙引號引起來,例如#define a(a) #a,那麼有a(10) <--> "10"

對空格的處理

a. 忽略傳入引數名前面和後面的空格。

如:str=example1(   abc ); 將會被擴充套件成 str="abc";

b. 當傳入引數名間存在空格時,編譯器將會自動連線各個子字串,用每個子字串中只以乙個空格連線,忽略其中多於乙個的空格。

如:str=exapme( abc    def); 將會被擴充套件成 str="abc def";

2.##的作用是分隔語義然後連線,例如:

#define a1(name, type)  type name_##type##_type 

#define a2(name, type)  type name##_##type##_type

則有:a1(a1, int) <--> int name_int_type

a2(a1, int) <--> int a1_int_type

解釋如下:

解釋:1) 在第乙個巨集定義中,"name"和第乙個"_"之間,以及第2個"_"和第二個"type"之間沒有被分隔,所以預處理器會把name_##type##_type解釋成3段:

「name_」、「type」、以及「_type」,這中間只有「type」是在巨集前面出現過

的,所以它可以被巨集替換。

2) 而在第二個巨集定義中,「name」和第乙個「_」之間也被分隔了,所以

預處理器會把name##_##type##_type解釋成4段:「name」、「_」、「type」

以及「_type」,這其間,就有兩個可以被巨集替換了。

3) a1和a2的定義也可以如下:

#define a1(name, type)  type name_  ##type ##_type

<##前面隨意加上一些空格》

#define a2(name, type)  type name ##_ ##type ##_type

結果是## 會把前面的空格去掉完成強連線,得到和上面結果相同的巨集定義

3.###可以看作是乙個##加乙個#,也就是先把後面的部分轉化成字串,再和前面的加在一起,例如#define a(name) "&"###name,則有 a(mike) <--> "&mike"

與 巨集定義的作用

核心中有很多的巨集定義,在巨集定義define中經常看到兩個字串 和 這裡把它的用法做一下說明 是乙個連線符號,用於把引數連在一起 例如 define foo arg my arg 則 foo abc 相當於 myabc 是 字串化 的意思。出現在巨集定義中的 是把跟在後面的引數轉換成乙個字串 例如...

CHECK 巨集定義的作用 caffe

個人在學習caffe原始碼檔案時遇到了check eq函式,不理解什麼含義,經過上下文理解,明白了其中含義。check eq x,y x y eq即equation,意為 等於 函式判斷是否x等於y,當x y時,函式列印出x y。check ne x,y x y ne即not equation,意為...

C 和 在巨集定義中的作用

將右邊的引數做整體的字串替換。define string x x x define text x name x inttest 將左右兩邊的引數做整體的字串拼接替換。define class name name class name define merge a,b a b a inttest 對於...