2013-04-08 33 views
4

頭文件cissvar.h有這樣的定義:使用雙散列(##)用C

#define CISSQ_REQUEST_QUEUE(name, index) 
static __inline void              
ciss_initq_ ## name (struct ciss_softc *sc)        
{                  
    STAILQ_INIT(&sc->ciss_ ## name);          
    CISSQ_INIT(sc, index);            
}    

而且在ciss.c實際使用情況是這樣的:

ciss_initq_free(sc); 
ciss_initq_notify(sc); 

這將是巨大的,如果有人能解釋這是如何工作的。

所以,
1)名稱指的是 「自由」 或 「通知」
2)哪裏 「指數」 從何而來? 3)編譯器如何在.h和.c之間進行魔術綁定?

+0

通過預處理器運行它,請參閱... – alk 2013-04-08 17:24:21

+0

[函數調用中的參數之前的雙重散列]可能的重複(http://stackoverflow.com/questions/7880058/double-hash-before-parameter-in-function-call)或[code-what-雙重哈希的意思](http://stackoverflow.com/questions/653466/reading-zend-engine-api-code-what-does-double-hash-means) – Mike 2013-04-08 17:26:39

+0

*實際使用*將需要看起來像'CISSQ_REQUEST_QUEUE(name,idx)',並且會創建一個包含'name'和'idx'的函數。 '##''符號是預處理器的標記粘貼操作符,它基本上使用靜態文本和/或宏參數,並將它們組合成單個字符串供編譯器稍後使用。 – 2013-04-08 17:27:20

回答

5

重要的線是這些(也cissvar.h):

CISSQ_REQUEST_QUEUE(free, CISSQ_FREE); 
CISSQ_REQUEST_QUEUE(notify, CISSQ_NOTIFY); 

它們調用宏,粘貼。 「##」運算符將兩個代碼字連接成一個單詞,因此第一行生成的代碼(使用宏擴展)如下所示:

static __inline void              
ciss_initq_free(struct ciss_softc *sc)        
{                  
    STAILQ_INIT(&sc->ciss_free);          
    CISSQ_INIT(sc, CISSQ_FREE);            
} 
+0

超級!非常感謝。 – hari 2013-04-08 18:22:21

5

##使預處理器將兩個參數連接到##運算符。