2013-04-08 61 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

##使预处理器将两个参数连接到##运算符。