關於gcc擴充套件中的巨集定義中用 和

2021-08-24 17:16:01 字數 1196 閱讀 4321

關於gcc擴充套件中的巨集定義中用 "#" 和 "##"

今天測試了巨集定義中的 "#" 和 "##" 的區別。

結果如下:

"#" 代表和乙個字串相連線

"##" 代表和乙個符號連線,符號可以是變數,或另乙個巨集符號。

舉例如下:

巨集定義如下

(1)#define dev_file_name "/dev/test_kft"

#define open_file(fd, n) \ \}

如此呼叫:

open_file(fd1, 1);

open_file(fd2, 2);

open_file(fd3, 3);

open_file(fd4, 4);

open_file(fd5, 5);

open_file(fd6, 6);

用gcc -e展開後,如下

2299: };

2300: };

2301: };

2302: };

2303: };

2304: };

如果沒有定義dev_file_name ,就是

2299: };

2300: };

2301: };

2302: };

2303: };

2304: };

所以可以很清楚的看出#n 解析出來的是"n" , 用於連線乙個已有的字串。

(2) 再來看 ## 是什麼意思, 巨集定義如下:

#define open_file(fd, n) \ \}

呼叫方式相同。

看巨集展開:

2299: };

2300: };

2301: };

2302: };

2303: };

2304: };

現在看清楚了, ##n 的作用是把n直接連線在了乙個符號的末尾. 好, 現在我們定義乙個符號看看效果。

#define dev_file_name1 "/dev/test_kft1"

再展開:

2299: };

2300: };

2301: };

2302: };

2303: };

2304: };

很顯然第乙個符號被替換了, 因為是符號是巨集的緣故。 這樣我們也能把這一擴充套件特性應用在變數上。

關於gcc擴充套件中的巨集定義中用 和

關於gcc擴充套件中的巨集定義中用 和 今天測試了巨集定義中的 和 的區別。結果如下 代表和乙個字串相連線 代表和乙個符號連線,符號可以是變數,或另乙個巨集符號。舉例如下 巨集定義如下 1 define dev file name dev test kft define open file fd,n...

巨集定義中的 和

連線符號由 兩個井號組成,其功能是在帶引數的巨集定義中將兩個子串 token 聯接起來,從而形成乙個新的子串。但它不可以是第乙個或者最後乙個子串。所謂的子串 token 就是指編譯器能夠識別的最小語法單元。具體的定義在編譯原理裡有詳盡的解釋 符是把傳遞過來的引數當成字串進行替代。假設程式中已經定義了...

關於巨集定義中 與 的用法

巨集在條件編譯以及各種大規模的定義裡是非常有用的。前面qt原始碼學習筆記裡就有一篇用來介紹巨集的定義。這次主要介紹下巨集定義裡 的作用。關於巨集,注意可以用gcc e test.cpp來檢視預編譯之後的結果。1.先介紹 主要是字串替換的作用。將傳入的符號轉化為字串 直接上源 define marco...