c語言巨集定義的連線符 和 轉字串

2021-06-16 15:35:46 字數 1345 閱讀 1617

c語言巨集定義的連線符有哪些

[此問題的推薦答案]

(一)巨集定義中的## 連線符與# 符 

## 連線符號由兩個井號組成,其功能是在帶引數的巨集定義中將兩個子串(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 

(二)"/"與乙個較長佔多行的巨集 

巨集定義中允許包含兩行以上命令的情形,此時必須在最右邊加上"/"且該行"/"後不能再有任何字元,連注釋部分都不能有,下面的每行最後的一定要是"/","/"後面加乙個空格都會報錯,更不能跟注釋。 

#define exchange(a,b) {/ 

int t;/ 

t=a;/ 

a=b;/ 

b=t;/ 

經常使用_t()巨集,它是怎麼來的?用va看了一下,原來_t是__t

#define _t(x)       __t(x)

再看看__t

在tchar.h中

#ifdef  _unicode

#define __t(x)      l ## x

#else

#define __t(x)      x

#endif

那麼,這個##是什麼呢?原來它是乙個連線符,將##左右兩邊的表示式連線成乙個.比如,在_unicode環境下,

_t(「unicode「) == l「unicode「

不過需要注意的是,巨集是由編譯器在編譯階段識別的,所以不能指望程式執行時起到連線作用.比如:

int a0, a1, a2, a3;

for (int i = 0; i < 4; i++)

a##i = i;

這種**就無法編譯了.

c語言巨集定義的連線符 和 轉字串

c語言巨集定義的連線符有哪些 此問題的推薦答案 一 巨集定義中的 連線符與 符 連線符號由兩個井號組成,其功能是在帶引數的巨集定義中將兩個子串 token 聯接起來,從而形成乙個新的子串。但它不可以是第乙個或者最後乙個子串。所謂的子串 token 就是指編譯器能夠識別的最小語法單元。具體的定義在編譯...

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

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

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

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