當前位置:編程學習大全網 - 網絡軟體 - c語言的 _##name意思?

c語言的 _##name意思?

## 連接符號由兩個井號組成,其功能是在帶參數的宏定義中將兩個子串(token)聯接起來,從而形成壹個新的子串。但它不可以是第壹個或者最後壹個子串。所謂的子串(token)就是指編譯器能夠識別的最小語法單元。

簡單的說,“##”是壹種分隔連接方式,它的作用是先分隔,然後進行強制連接。其中,分隔的作用類似於空格。我們知道在普通的宏定義中,預處理器壹般把空格解釋成分段標誌,對於每壹段和前面比較,相同的就被替換。但是這樣做的結果是,被替換段之間存在壹些空格。如果我們不希望出現這些空格,就可以通過添加壹些 ##來替代空格。

舉列 – 試比較下述幾個宏定義的區別

#define A1(name, type) type name_##type##_type 或

#define A2(name, type) type name##_##type##_type

A1(a1, int);

A2(a1, int);

解釋:

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

結果是## 會把前面的空格去掉完成強連接,得到和上面結果相同的宏定義。

或再比如

#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;

詳細使用方法,可以參考如下博客內容:/s/blog_7d9463b20100xp5t.html

  • 上一篇:國語版的鬼片要影片名字
  • 下一篇:推薦點好看的動漫
  • copyright 2024編程學習大全網