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

2021-09-30 13:54:12 字數 2171 閱讀 4556

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

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

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

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

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

a1(a1, int);  /* 等價於: int name_int_type; */

a2(a1, int);  /* 等價於: int a1_int_type;   */

解釋: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;

其他相關 – 單獨的乙個 #

至於單獨乙個#,則表示 對這個變數替換後,再加雙引號引起來。比如

#define  __stringify_1(x)   #x

那麼__stringify_1(linux)   <==>  」linux」

所以,對於module_device_table

1) #define module_device_table(type,name)                        

module_generic_table(type##_device,name)

2) #define module_generic_table(gtype,name)                      

extern const struct gtype##_id __mod_##gtype##_table     

__attribute__ ((unused, alias(__stringify(name))))

得到  

module_device_table(usb, products)  

/*notes: struct usb_device_id products; */

<==> module_generic_table(usb_device,products)

<==> extern const struct usb_device_id __mod_usb_device_table     

__attribute__ ((unused, alias(」products」)))   

注意到alias attribute需要乙個雙引號,所以在這裡使用了__stringify(name)來給name加上雙引號。另外,還注意到乙個外部變數」__mod_usb_device_table」被alias到了本驅動專用的由使用者自定義的變數products

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

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

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

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

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

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