c語言中 連線符與 符

2021-06-06 16:21:24 字數 1041 閱讀 6272

## 連線符與# 符  

##連線符號由兩個井號組成,其功能是在帶引數的巨集定義中將兩個子串(token)聯接起來,從而形成乙個新的子串。但它不可以是第乙個或者最後乙個子串。所謂的子串(token)就是指編譯器能夠識別的最小語法單元。具體的定義在編譯原理裡有詳盡的解釋,但不知道也無所謂。同時值得注意的是#符是把傳遞過來的引數當成字串進行替代。下面來看看它們是怎樣工作的。這是msdn上的乙個例子。  

假設程式中已經定義了這樣乙個帶引數的巨集:  

#define paster( n ) printf( "token" #n " = %d", token##n )  

同時又定義了乙個整形變數:  

int token9 = 9;  

現在在主程式中以下面的方式呼叫這個巨集:  

paster( 9 );  

那麼在編譯時,上面的這句話被擴充套件為:  

printf( "token" "9" " = %d", token9 );  

注意到在這個例子中,paster(9);中的這個」9」被原封不動的當成了乙個字串,與」token」連線在了一起,從而成為了token9。而#n也被」9」所替代。  

可想而知,上面程式執行的結果就是在螢幕上列印出token9=9  

在atl的程式設計中,我們檢視它的源**就會經常看見這樣的一段:  

#define implements_inte***ce(itf) \  

,  

我們經常不假思索的這樣使用它:  

……  

implements_inte***ce(icat)  

……  

實際上iid_icat 已經在別的地方由atl嚮導定義了。當沒有嚮導的時候,你只要遵循把iid_加在你的介面名前面來定義guid的規則就也可以使用這個巨集。在實際的開發過程中可能很少用到這種技巧,但是atl使用得如此廣泛,而其中又出現了不少這樣的源**,所以明白它是怎麼一回事也是相當重要的。我的乙個朋友就是因為不知道implements_inte***ce巨集是怎麼定義的,而又不小心改動了iid_icat的定義而忙活了一整天。

C語言巨集定義 連線符和 符的使用

c語言中如何使用巨集c 和c 中的巨集 macro 屬於編譯器預處理的範疇,屬於編譯期概念 而非執行期概念 下面對常遇到的巨集的使用問題做了簡單總結。在c語言的巨集中,的功能是將其後面的巨集引數進行字串化操作 stringfication 簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上乙個...

C語言巨集定義 連線符和 符的使用

c語言中如何使用巨集c 和c 中的巨集 macro 屬於編譯器預處理的範疇,屬於編譯期概念 而非執行期概念 下面對常遇到的巨集的使用問題做了簡單總結。在c語言的巨集中,的功能是將其後面的巨集引數進行字串化操作 stringfication 簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上乙個...

C語言巨集定義 連線符和 符的使用

c語言中如何使用巨集c 和c 中的巨集 macro 屬於編譯器預處理的範疇,屬於編譯期概念 而非執行期概念 下面對常遇到的巨集的使用問題做了簡單總結。關於 和 在c語言的巨集中,的功能是將其後面的巨集引數進行字串化操作 stringfication 簡單說就是在對它所引用的巨集變數 通過替換後在其左...