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 對於...