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