C語言巨集與單井號( )和雙井號( )

2021-06-22 12:58:54 字數 1931 閱讀 6962

說明:以前知道,但是沒系統的看過,大神們的**經常這種技巧,現在系統總結一下。

c(和c++)中的巨集(macro)屬於編譯器預處理的範疇,屬於編譯期概念(而非執行期概念)。下面對常遇到的巨集的使用問題做了簡單總結。

關於#和##

在c語言的巨集中,#的功能是將其後面的巨集引數進行字串化操作(stringfication),簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上乙個雙引號。比如下面**中的巨集:

#define warn_if(exp) /

do /

while(0)

那麼實際使用中會出現下面所示的替換過程:

warn_if (divider == 0);

被替換為

do while(0);

這樣每次divider(除數)為0的時候便會在標準錯誤流上輸出乙個提示資訊。

而##被稱為連線符(concatenator),用來將兩個token連線為乙個token。注意這裡連線的物件是token就行,而不一定是巨集的變數。比如你要做乙個選單項命令名和函式指標組成的結構體的陣列,並且希望在函式名和選單項命令名之間有直觀的、名字上的關係。那麼下面的**就非常實用:

struct command

;#define command(name)

// 然後你就用一些預先定義好的命令來方便的初始化乙個command結構的陣列了:

struct command commands =

command巨集在這裡充當乙個**生成器的作用,這樣可以在一定程度上減少**密度,間接地也可以減少不留心所造成的錯誤。我們還可以n個##符號連線 n+1個token,這個特性也是#符號所不具備的。比如:

#define link_multiple(a,b,c,d) a##_##b##_##c##_##d

typedef struct _record_type link_multiple(name,company,position,salary);

// 這裡這個語句將展開為:

// typedef struct _record_type name_company_position_salary;

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

則 int a(1) = 10; //等效於int t_1 = 10;

#define a(x)  tx##__

則 int a(1) = 10; //等效於int t1__ = 10;

#define b(x) #@x

則b(a)即』a』,b(1)即』1』.但b(abc)卻不甚有效.

#define c(x) #x

則c(1+1) 即 」1+1」.

C語言巨集與單井號( )和雙井號( )

分類 程式設計基礎 2011 10 20 20 10 11977人閱讀收藏 舉報 語言c token command struct 目錄 c 和c 中的巨集 macro 屬於編譯器預處理的範疇,屬於編譯期概念 而非執行期概念 下面對常遇到的巨集的使用問題做了簡單總結。關於 和 在c語言的巨集中,的功...

關於c語言巨集定義中的單 井號 和雙 井號

看了這篇文章後了解了,但是文章中的例子比較特別,我在這裡加個注釋好了。單井號就是將後面的 巨集引數 進行字串操作,就是將後面的引數用雙引號引起來 雙井號就是用於連線。define print name printf token name d n token name 呼叫時候使用 print 9 巨...

C語言巨集定義時 井號 和 雙井號 作用

的功能是將其後面的巨集引數進行字串化操作 stringfication 簡單說就是在對它所引用的 巨集變數通過替換後在其左右各加上乙個雙引號。define example instr printf the input string is t s n instr define example1 ins...